C#의 프리 컴파일러에서 현재 DateTime을 어떻게 얻을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/419507

  •  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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top