2009-12-14 3 views
9

제목이 다소 설명력이 있기를 바랍니다.디자인 타임에 빌드 날짜가 자동으로 삽입되도록하려면 어떻게합니까?

나는 C#에서 .net 2.0으로 작성된 winform 응용 프로그램이 있습니다. about 상자와 초기 스플래시 상자에서 사용할 변수에 자동으로 마지막 컴파일 날짜를 업데이트하고 싶습니다. 현재 수동으로 업데이트하는 문자열 변수가 있습니다. 이 일을 할 수있는 방법이 있습니까?

VS2008 2.0 C#을

답변

5

또 다른 트릭 (사용하지 못할 수 있음)은 .NET에서 생성 된 자동 빌드 및 수정 번호를 활용하는 것입니다. AssemblyInfo에있는 경우 :

[assembly: AssemblyVersion("1.0.*")] 

마지막 두 숫자는 날짜/시간 스탬프입니다. 일부 코드 (아래 목록) 도움이 될 수

Version v = Assembly.GetExecutingAssembly().GetName().Version; 
DateTime compileDate = new DateTime((v.Build - 1) * TimeSpan.TicksPerDay + v.Revision * TimeSpan.TicksPerSecond * 2).AddYears(1999); 

편집 : https://stackoverflow.com/a/804895/2258

+1

주의! 이 코드는 윤년 때문에 2012 년 3 월 11 일에 무언가를 만들 때 작동하지 않습니다. 3 월 11 일 대신 3 월 12 일을 반환합니다. – JYL

0

더 붙박이 매크로 나이 비슷한 없다 .NET. 최선의 방법은 tigris, Time 작업 및 RegexReplace 또는 그와 유사한 사용자 지정 빌드 태스크 일 수 있습니다. 옳다는 것은 간단하지 않습니다. 개인적으로 저장소 버전을 사용하여 AssemblyInfo를 업데이트합니다 - 광범위하게 관련이 있습니까?

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
... 
<SvnInfo LocalPath="."> 
    <Output TaskParameter="Revision" PropertyName="BuildRev" /> 
</SvnInfo> 
<FileUpdate Files="protobuf-net\Properties\AssemblyInfo.cs" 
     Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
     ReplacementText='$1.$2.$(BuildRev)$5' /> 
+0

나는이 방법이 소스 파일을 변경해서는 안되기 때문에 동의하지 않는다. – MarkPflug

1

내가 codeproject.com에서 this about box을 사용 : 여기에 내가 넣어 것보다 따라하기 좀 명확하게 수있는 대안 대답. 2004 년 Jeff Atwood가 실제로 작성했습니다. 어셈블리 파일에서 날짜 스탬프를 보거나 어셈블리 버전에서 계산하여 컴파일 시간을 계산합니다. 아마도 거기에서 관련 코드를 추출 할 수 있습니다.

2

미리 빌드 이벤트에이를 팝하십시오.

echo public static class DateStamp { public readonly static System.DateTime BuildTime = System.DateTime.Parse("%date%"); } > $(ProjectDir)DateStamp.cs 

이렇게하면 DateStamp라는 클래스가 만들어집니다.

public static class DateStamp 
{ 
    public readonly static System.DateTime BuildTime = System.DateTime.Parse("14/12/2009"); 
} 

그리고 이렇게하면됩니다.

Console.WriteLine("Build on " + DateStamp.BuildTime.ToShortDateString()); 
+0

빌드하기 전에 "DateStamp"를 어떻게 인식합니까? 오류가 발생했습니다 ... 'DateStamp'이름이 현재 컨텍스트에 존재하지 않습니다. – Brad

+0

아, 맞습니다. 파일 (DateStamp.cs)은 프로젝트의 루트 폴더에 있습니다. VS에서는 솔루션 탐색기로 이동하여 현재 프로젝트에없는 파일을 포함하여 모든 파일을 표시하는 버튼을 클릭합니다. DateStamp.cs를 찾아 마우스 오른쪽 단추로 클릭하고 '프로젝트에 포함'을 선택하십시오. 이제 프로젝트의 일부로 빌드 된 것을 발견해야합니다. –

1

이것은 너무 늦어 유용하지 않을 수 있지만 다른 사람에게 도움이 될 수 있습니다.

당신은 당신의 csproj 파일이 대상을 추가 할 수 있습니다

, 그냥 말을에 붙여 넣습니다

<Target Name="BuildDate" BeforeTargets="CoreCompile"> 
    <PropertyGroup> 
     <SharedAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</SharedAssemblyInfoFile> 
    </PropertyGroup> 
    <ItemGroup> 
     <Compile Include="$(SharedAssemblyInfoFile)" /> 
    </ItemGroup> 
    <ItemGroup> 
     <AssemblyAttributes Include="AssemblyMetadata"> 
     <_Parameter1>AssemblyDate</_Parameter1> 
     <_Parameter2>$([System.DateTime]::UtcNow.ToString("u"))</_Parameter2> 
     </AssemblyAttributes> 
    </ItemGroup> 
    <WriteCodeFragment Language="C#" OutputFile="$(SharedAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" /> 
    </Target> 

이 한 행을 포함하여 "OBJ"폴더에 CustomAssemblyInfo.cs 파일을 생성합니다 : [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")] 이 파일은 어셈블리로 컴파일됩니다, 그래서 당신은 다음 코드에서와 같이 반사를 사용하여 런타임에 액세스 할 수 있습니다 :

using System; 
using System.Linq; 
using System.Reflection; 

public class Application 
{ 
    static DateTime BuildDate; 
    public static DateTime GetBuildDate() 
    { 
     if (BuildDate == default(DateTime)) { 
      var attr = typeof(Application).Assembly.GetCustomAttributes<AssemblyMetadataAttribute>(); 
      var dateStr = attr.Single(a => a.Key == "AssemblyDate")?.Value; 
      BuildDate = DateTime.Parse(dateStr); 
     } 
     return BuildDate; 
    } 
} 

한 가지주의해야 할, 내가 여기에 사용하고있어 만했다 AssemblyMetadataAttribute 추가 된 .NET 4.5.3이므로 이전 버전을 지원해야하는 경우 날짜 값을 보유 할 고유 한 사용자 정의 속성 유형을 간단히 정의 할 수 있습니다.

관련 문제