C#의 프리 컴파일러에서 현재 DateTime을 어떻게 얻을 수 있습니까?
-
03-07-2019 - |
문제
C# 3.0에는 클래스 버전을 포함한다고 가정하는 속성이 있습니다. 버전 번호는 단순히 편집 날짜와 시간입니다. 지금은 다음과 같은 코드가 있습니다.
public DateTime Version
{
get { return DateTime.UtcNow; }
}
분명히, 이것은이 속성이 현재 날짜와 시간을 반환하기 때문에 잘못되었습니다. 따라서 프리 컴파일러는 할 수 있습니다 인쇄 컴파일 타임에 시간이 걸리나요? 이 경우 아래와 비슷한 일을 할 수 있습니다.
public DateTime Version
{
get { return new DateTime("PRECOMPILER DATE"); }
}
해결책
C#에는 매크로의 개념이 없습니다. 그러나 빌드 스크립트 (csproj / nant / etc)의 다른 도구를 사용하여 컴파일하기 전에 소스를 조작 할 수 있습니다. 예를 들어,이를 사용하여 수정 번호를 현재 SVN 개정판으로 설정합니다.
저렴한 옵션은 사전 건설 이벤트입니다 (VS의 프로젝트 속성 대화 상자를 통해이를 수행 할 수 있음) : 본질적으로 빌드 전에 실행되는 BAT 파일; 그런 다음 필요한 변경 사항을 스크립트 할 수 있습니다. 보다 정교한 옵션은 빌드 작업입니다.
예를 들어, 유틸리티 라이브러리 여기 포함 Time
과제와 a FileUpdate
직무; 이론적으로 두 사람을 함께 묶어 필요한 것을 모방하는 것이 가능해야합니다.
개인적으로, 나는 그것을 사용할 것이다 [AssemblyVersion]
시간이 아닌 세부 사항 -이를 소스 제어 시스템에 연결하면 문제가되는 버전을 쉽게 찾을 수 있습니다. SVN 버전의 경우 (빌드 Proj에서) 사용합니다.
<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
<Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
ReplacementText='$1.$2.$(BuildRev)$5' />
그리고 이제 OS에서보고하는 파일 버전을 포함하여 내 어셈블리 버전이 정확합니다.
다른 팁
당신은 DLL 자체에서 그것을 다시 살펴볼 수 있습니다 (출처 : CodingHorror)
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;
}
동등한 것은 없습니다 __TIME__
C#의 사전 처리기 지침은 현재 조립품을 얻고 생성 날짜를 얻는 것입니다. 컴파일 시간이 포함됩니다. 보다 여기
C# -C ++ 스타일 매크로 정의 에서이 작업을 수행 할 수있는 방법이 없다고 생각합니다.
어셈블리의 마지막 수정 날짜를 사용하여 작업을 수행하거나 잠재적으로 텍스트 파일을 임베디드 리소스로 포함시키고 현재 날짜/시간을 작성하는 사용자 정의 빌드 작업을 추가 할 수 있습니다.
사전 처리기가 없습니다 __TIME__
지침이지만 어셈블리의 창조 시간과 같이 사용할 수있는 다른 것들이 있습니다. 소스 제어 시스템에서 키워드 대체를 사용하는 것을 고려할 수도 있습니다 (Subversion의 $ $ $ $).
그만큼 짓다 숫자는 어셈블리의 메타 데이터에서 검색 할 수 있으며 빌드 날짜와 일치하도록 설정할 수 있습니다.
일반적으로 AssemblyInfo.cs 파일에서 항목을 찾거나 작성합니다. 프로젝트가 Visual Studio를 사용하여 만들어지면 An example:
[assembly: AssemblyVersion("1.0.*")]
문서에 대한 견적 어셈블리 versionattribute. (나는 몇 가지 중요한 부분을 대담하게했다)
모든 값을 지정하거나 별표를 사용하여 기본 빌드 번호, 개정 번호 또는 둘 다를 수용 할 수 있습니다 (). 예를 들어, [Assembly : AssemblyVersion ( "2.3.25.1")]은 2를 주요 버전으로, 3은 마이너 버전으로, 25는 빌드 번호로, 1은 개정 번호로 표시합니다. Assembly : AssemblyVersion ( "1.2.")]은 1을 주요 버전으로, 2를 마이너 버전으로 지정하고 기본 빌드 및 개정 번호를 허용합니다. Assembly : AssemblyVersion ( "1.2.15.*")]와 같은 버전 번호는 1을 주요 버전으로, 2는 마이너 버전으로, 15는 빌드 번호로 15로 지정하고 기본 개정 번호를 수락합니다. 기본 빌드 번호는 매일 증가합니다. 기본 개정 번호는 무작위입니다.
보시다시피, 기본 빌드 번호를 설정할 수 있다면. 기본 빌드 번호는 매일 증가하는 값입니다.
그런 다음 사용하여 빌드 번호를 검색 할 수 있습니다. Assemblyname.version 재산. MSDN이 제공 한 예제는 당신을 가야합니다.
기본 빌드 번호는 2000 년 1 월 1 일 이후의 일 수입니다.
이 질문 또한 이것을 사용하는 방법에 대한 명확한 설명이 있습니다.
다음과 같은 것을 찾고 있습니까?
(Get Get get is version-info를 통해 어셈블리 구축 날짜; 빌드 너버는 1.1.2000 이후의 날입니다)
var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime versionsDatum = new DateTime(2000, 1, 1);
versionsDatum = versionsDatum.AddDays(version.Build);