Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/64: Рейтинг темы: голосов - 64, средняя оценка - 4.58
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 29
1

Как вставить дату текущей компиляции?

29.03.2011, 13:39. Показов 12604. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В некоторых программах есть строка мол "Copiled бла-бла-бла". Как сделать так, чтобы компилятор C# тоже вставлял текущую дату в исходник при компилировании (интересует это для заголовка WinForms и просто консольных приложений).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2011, 13:39
Ответы с готовыми решениями:

Как вставить содержимое файла в *.cs при компиляции?
Есть файл с полсотней функций на шарпе. Для скорости работы они не оформлены как отдельный класс и...

[РЕШЕНО]GCC+makefile=вставить в *.bin дату компиляции?
Собственно вопрос в сабже. Просто вставить - не проблема, но вставляется в произвольное место и...

Как сравнить дату с текущей?
Имеется поле с датой в будущем времени. Необходимо сравнение её с текущей датой и в случае, если...

Как вычесть из текущей даты, дату в документе?
Подскажите пож. (желательно как для чайника). Есть документ с полем дата date_p. Надо создать...

20
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
29.03.2011, 13:43 2
C#
1
DateTime.Now
0
гроза ленивых студентов
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
29.03.2011, 14:13 3
Johnny_D, я так понимаю, человеку нужно, чтобы у него на формах отображалось время компиляции, а не время запуска приложения...

если я правильно понимаю, то один из путей такой: узнать имя исполняемого файла (не забить жестко, а именно узнать, ибо юзер файл может переименовать), затем узнать время последнего изменения этого файла (когда мы запускаем экзешник мы ведь его не изменяем изменяется он только при компиляции)... если теория верна, то можно использовать такой код:
C#
1
2
            FileInfo f = new FileInfo(Application.ExecutablePath);
            MessageBox.Show(f.LastWriteTime.ToString());
мессаджБокс тут для наглядности... а так f.LastWriteTime можно использовать там где надо - вставить в заголовок формы например:
C#
1
this.Text = "Compiled on " + f.LastWriteTime.ToString();
1
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
29.03.2011, 14:15 4
znake, логично, я поспешил тут.
0
194 / 193 / 17
Регистрация: 07.11.2010
Сообщений: 477
29.03.2011, 14:47 5
Но это не совсем то... дату файла можно поменять (иногда меняется при копировании, скачивании некоторыми программами). И версия программы сразу изменится, а это нехорошо
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
29.03.2011, 14:50 6
Leax, ну версия программы - это не есть дата, для этого есть специальное поле в свойствах сборки.
0
гроза ленивых студентов
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
29.03.2011, 14:52 7
Leax, а версия программы то изменится от чего?!
а относительно даты файла...меняется по идее лишь дата создания, открытия при этих процессах...ибо система их перезаписывает при таких раскладах...вот если бы прога сама себя качала из инета (при обновлении) - то, может это бы и меняло данный атрибут, но! при скачивании обновления мы и так качаем новую версию с новой датой компиляции...

ну либо я где-то ошибаюсь - не знаю...посмотрел, пару раз файл по разным папкам покопировал - вроде нормально все осталось...
0
194 / 193 / 17
Регистрация: 07.11.2010
Сообщений: 477
29.03.2011, 14:53 8
nio, но вопрос остался открытым: как при компиляции программы сохранять текущие данные (например, текущую дату), чтобы потом их можно было прочитать в программе во время выполнения exe-файла. Может есть какие-то специальные директивы компилятора?
1
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
29.03.2011, 14:58 9
Leax, Я не знаю как насчет даты, но для сохранения версии сборки есть спец. поле, и заполняется оно вручную
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 29
29.03.2011, 15:03  [ТС] 10
Цитата Сообщение от Leax Посмотреть сообщение
Может есть какие-то специальные директивы компилятора?
Я тоже об этом и думаю. Ибо дата создания/изменения меняется и сбивается иногда при копировании.
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
29.03.2011, 15:25 11
Ticksy, на иностранных форумах эта тема не раз поднималась. Общая суть решения сводилась к следующему алгоритму:
есть версия сборки и версия файла, допустим, версию файла мы используем по назначению. Тогда берем определенную дату (допустим, 1 января 2000 года) и считаем разницу в днях\секундах\любых удобных единицах от этой даты до текущего дня. И записываем разницу в версию сборки, которую все равно не используем.
Затем при запуске программы извлекаем версию сборки, прибавляем её с помощью стандартной функции к известной начальной дате и получаем дату компиляции.

Добавлено через 16 минут
Нашел интересное решение, берет время из верхнего колонтитула исполняемого файла.
Сам пока разбираюсь, вот решение, как есть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private DateTime RetrieveLinkerTimestamp()
{
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    System.IO.Stream s = null;
 
    try
    {
        s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        s.Read(b, 0, 2048);
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }
    }
 
    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}
0
194 / 193 / 17
Регистрация: 07.11.2010
Сообщений: 477
29.03.2011, 23:24 12
Придумал отличное решение! Сделано немного через задницу, но поэтому - универсальное!

Суть такая:

1. cоздаем вспомогательный проект Prepare, который сохраняет текущую дату в текстовый файл "mydata.txt" и закрываем его.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Подготовка информации
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace Prepare
{
    class Program
    {
        static void Main(string[] args)
        {
            String sDate = ""+ DateTime.Now; // приготовили информацию
 
            StreamWriter sw = new StreamWriter(@"mydata.txt"); // 29.03.2011 20:35:37
            sw.WriteLine(sDate);
            sw.Close();
        }
    }
}
2. Открываем наш основной проект (например, называется TestResource)

3. Создаем в проекте новый текстовый ресурс mydata:
- заходим в свойства проекта "Project\ TestResource Propeties ..." (внизу меню).
- далее: TestResource\ Resources; затем вверху: Add Resource \ Add New Text File
- на запрос имени вводим mydata
- появится пустое окно, которое сразу закрываем (Вверху делаем правый клик по закладке mydata.txt - выбираем Close)
- в окне ресурсов должен появиться элемент mydata.
- выделяем его мышкой и копируем в буфер его свойство FileName (у меня, например, D:\Мои документы\Visual Studio 2008\Projects\TestResource\TestResource\Resources\mydata.txt). Теперь у нас есть путь к файлу ресурса

4. Настраиваем этот ресурс так, чтобы он включался в код exe-файла:
- открываем Solution explorer (меню View\ Solution Explorer)
- в списке ресурсов (Resources) должен быть файл mydata.txt
- кликаем на нём правой кнопкой - выбираем Properties
- настраиваем: Build Action = Embedded Resource

3. Теперь настраиваем в свойствах проекта свойство Pre-build event command line (в свойствах проекта слева закладка Build Events).
- в поле Pre-build event command line пишем:
d:\Prepare.exe
- закрываем и сохраняем наш основной проект

4. Исправляем вспомогательный проект Prepare - вносим реальный полный путь к файлу mydata.txt основного проекта TestResources
- исправляем код
C#
1
StreamWriter sw = new StreamWriter(@"mydata.txt");
на код с полным путём:
C#
1
StreamWriter sw = new StreamWriter(@"D:\Мои документы\Visual Studio 2008\Projects\TestResource\TestResource\Resources\data.txt");
- компилируем файл prepare.exe
- закрываем вспомогательный проект Prepare
- копируем файл prepare.exe в d:\prepare.exe

5. Открываем основной проект TestResources и добавляем в код для теста строки:
C#
1
2
3
String s = Properties.Resources.mydata; // получить текстовые данные из прикомпилированного текстового файла
Console.WriteLine(s);  // 29.03.2011 20:35:37
Console.ReadLine();
Теперь во время компиляции основного проекта будет происходить следующее:
- перед компиляцией выполняется файл prepare.exe, который сохраняет дату в текстовый файл mydata.txt
- т.к. mydata.txt является файлом-ресурсом, то он включается в код компилируемого exe-файла основного проекта
- при запуске основного проекта происходит чтение из прикомпилированного ресурса
- задача решена!

Таким образом, во время компиляции файла можно сохранить любую информацию, которая впоследствии может быть прочитана уже во время выполнения exe-файла

З.Ы.: можно сделать еще лучше, если в prepare.exe использовать параметры командной строки для указания места хранения файла-ресурса основного проекта
1
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
29.04.2014, 08:24 13
я делаю так
C#
1
2
3
4
5
public Form1()
        {
            InitializeComponent();
            this.Text = "Программа. Версия от "+File.GetLastWriteTime(Application.ExecutablePath).ToString("yyyy-mm-dd");
        }
0
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
29.04.2014, 10:05 14
а не проще взять от сюда утилиту для автоматического увеличения номера версии при компиляции и настроить генерацию версии компиляции на дату/время?
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
29.04.2014, 10:11 15
AntonChik, hepper, откопали же тему трехлетней давности!

Ну, раз уж подняли.
Дату и время компиляции можно вшить в версию приложения, достаточно в свойствах проекта в закладке Assembly очистить поле Revision и в поле Build прописать "*" (без кавычек).
Если это сделать, то студия автоматом пропишет дату компиляции в версию продукта в следующем формате:
Build = количество дней с 1 января 2000 года.
Revision = количество секунд с полуночи, деленное на два.

После чего достать ее в коде — две строчки:
C#
1
2
var version = Assembly.GetExecutingAssembly().GetName().Version;
var buildDate = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2);
3
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
30.12.2016, 15:46 16
kolorotur, Может не в тему, но: Visual Studio 2015 - такого я там не нашёл, в той последовательности что вы описали. Только в "Публикация" - есть намёк на указаные параметры, только "*" не хочет принимать.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
30.12.2016, 15:54 17
Цитата Сообщение от 47911 Посмотреть сообщение
Visual Studio 2015 - такого я там не нашёл
В свойствах проекта на самой первой закладке (Application) есть кнопка Assembly Information — вам туда
1
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
30.12.2016, 16:17 18
а. Тяжело быть тупым. . .

Добавлено через 13 минут
А оно ругается: "Версия сборки", "Версия файла сборки" - Недопустимый формат версии. При "Чистом поле" или *.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
30.12.2016, 16:28 19
Цитата Сообщение от 47911 Посмотреть сообщение
оно ругается
Попробуйте вот так:
Как вставить дату текущей компиляции?
1
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
30.12.2016, 16:57 20
Зафурычило!
0
30.12.2016, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2016, 16:57
Помогаю со студенческими работами здесь

Как узнать полную дату понедельника текущей недели?
на манипуляциях с датами мой мозг покинул меня, так что прошу Вас помочь)

Как изменить дату компиляции
Всем привет! Во время работы с VS 2013 Express поменял дату на компе на более позднюю (то есть...

Как вставить дату в форму?
Как вставить дату в форму? Типа так: Последнее обновление базы: 01 октября 2004 года Обновить...

Как вставить дату и время
Доброго дня всем! Подскажите пожалуйста как вставить в поле, описанное как DATE NOT NULL, дату и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru