2009-11-19 3 views
6

모든 .NET 어셈블리는 버전 번호에 1.0. * 형식을 사용합니다. 아마도 *는 현재 날짜와 시간으로 대체되고 숫자로 변환됩니다. 그것을 다시 날짜와 시간으로 변환하는 공식은 무엇입니까?.net 어셈블리 버전을 날짜로 변환 할 수 있습니까?

+0

진드기? '새로운 DateTime (긴 ticks)' –

+0

당신이 의미하는 것을 보여줄 수 있습니까? – CesarGon

+0

* gtes가 현재 날짜/시간과 관련되어 있다는 것을 어디에서 알게 되었습니까? – David

답변

14

, 나는, 빌드 번호 1 2000 년 1 월 개정 이후의 일 수를 초 그러나 2

var result = new DateTime(2000, 1, 1); 
result = result.AddDays(buildNumber); 
result = result.AddSeconds(revision * 2); 

로 나눈 당일 자정 이후입니다 것으로 나타났습니다 다른 사람들이 이미 지적한 바에 따르면 문서화가 이것이 항상 사실이라는 것을 보장하지는 않습니다.

+0

감사합니다! 그것이 내가 필요한 것입니다. –

0

조립 버전은 여기에 설명되어 있습니다 : 아래의 인용문에서 http://msdn.microsoft.com/en-us/library/51ket42z.aspx

, 나는 것이 무엇을 요구하는지하는 것은 불가능하며 귀하의 정보가 잘못되었다고 말한다.

총회 버전 번호의 각 조립 는 정체성의 일부로 버전 번호가 있습니다. 따라서 버전 번호가 인 두 어셈블리는 런타임에 의해 완전히 다른 어셈블리로 간주되는 입니다. 이 버전 번호가 물리적으로 다음 형식의 네 부분으로 된 문자열로 표시 입니다 : 나는에 링크 된 페이지의 하단에

<major version>.<minor version>.<build> number>.<revision> 

그러나,이 사용자 지정 어셈블리에 대한 정보는 속성과 어셈블리 속성 설정에 대한 링크. 거기에 도움이 될만한 것을 찾을 수 있습니다.

이의 결과는 빌드입니다 : - 편집 난 당신이 내 댓글에 대한 답에 게시 링크, 내가 볼 수있는 유일한 것은 한 번 봐했다

추가이있다 숫자 은 무작위 지정된 시작일 이후의 일 수로 설정되고 자정부터 자정 이후로 초의 수를 기준으로 수정됩니다.

무작위로 지정된 시작 날짜가 무엇인지 알아낼 수 있다면 "무작위로 지정된 시작 날짜"라고 말하고 싶습니다. 찾아내는 데 가치가있다. 당신은 더 나은 것 가장 pactices

을 코딩

뻔뻔한 플러그 개정 제어 및 자동화 된 빌드 프로세스를 사용하고 asembly의 빌드 날짜를 결정하는 것과 로그를 사용하는 봉사했다.

2

버전 문자열이 형식은 :

<major version>.<minor version>.<build number>.<revision> 

을하고 버전을 설정하면 당신은 1.0.*에 설명했듯이 :

이의 결과에 빌드 번호 세트입니다 무작위 지정된 시작 날짜 이후 자정 이후 초를 기준으로 개정판 이후의 일 수.

여기의 키는 "임의"입니다.따라서 수정본을 하루 중 시간대로 번역 할 수는 있지만 날짜로 해석 할 수없는 것처럼 들립니다.

http://msdn.microsoft.com/en-us/library/ms998223.aspx

+0

흥미로운 점은 MSDN 링크와 내 링크가 서로 충돌하고 있다는 것입니다. –

+0

죄송합니다. @Michael - 실수로 내 게시물을 편집 한 다음 내 실수를 인식하고 내 게시물을 내 게시물에서 삭제하고 직접 작성했습니다. 사고 였어. * 죄송합니다 * – David

+0

당신의 결론처럼 보이기 때문에 +1을 읽었습니다. – David

2

MSDN에 따르면 : "기본 빌드 번호 증가를 매일 기본 버전 번호는 무작위입니다.."

AssemblyVersionAttribute의 출처를 반사경으로 보면 아무 것도하지 않고 그냥 문자열 만 수락한다는 것을 알 수 있습니다. 그래서 마법은 컴파일러 자체에서 발생합니다. 필자가 말할 수있는 한 어디에서나 문서화되지 않았습니다. "매일 증가"는 어느 시점에서부터 시작되는 것입니까?

신뢰성이있는이 버전을 사용할 수있을 것으로 기대하지 않습니다. 아마도 소스 제어 시스템이나 그와 비슷한 버전에서 자신의 버전을 기반으로하는 것이 더 좋습니다. 실제로

+0

그리고 너에게 +1. – David

+0

소스 제어 시스템의 라벨링에 +1. – Russell

+0

신뢰성은 중요하지 않습니다. 단지 뭔가가 필요합니다. –

0

자동 생성 된 빌드 번호에서 날짜/시간을 계산할 수 있다고하더라도 나는 추천하지 않습니다. 빌드 번호는 그 목적을위한 것이 아닙니다. 이는 단순히 지속적으로 증가하기 위해 의존 할 수있는 자동 생성 값을 의미합니다. 더 이상 로직을 소비하는 어플리케이션으로 가정해서는 안됩니다. 버전 번호 조각에 날짜/시간 스탬프를 포함 시키려면 해당 논리를 빌드 프로세스/스크립트에 통합해야합니다. 그렇지 않으면 그렇게 할 수도 있습니다. 년 | | 월 | 일 | BuildCounter |

+0

내가 논리를 작성한다는 것을 어떻게 알 수 있습니까? 아마도 저는 DLL을보고있을 때 DLL을 가장 잘 추측하려고합니다. –

+0

둘 다 가질 수 있습니다. 예 : 170504는 증가하는 숫자이고 YYMMDD 날짜입니다. 당신은 한 발자국 올리지는 못하지만, 그럴 필요는 없다는 것을 알 수 있습니다. – tenpn

0

나는 내 어셈블리가있는 AssemblyInfo.cs

우리는 버전에 대해 다음과 같은 형식을 사용에 UpdateVersion를 호출에 PostBuild 스크립트를 사용합니다.

업데이트 버전은 오픈 소스이므로 수정할 수 있습니다.

저는 현재 날짜와 각 빌드가 증가한 카운터를 사용하도록 수정했습니다.

이 방법은 버전 번호가 항상 변경되므로 버전 번호에서 날짜를 파생시킬 수 있습니다.

실제로 매우 편리합니다.

0

이전 게시물이지만 빌드시 버전 번호를 업데이트하기위한 또 다른 (쉬운) 옵션이 제공됩니다. MSBUILD RegexTransform 단계를 사용하여 버전 번호를 수정했습니다. 다음은이 기능을 구현해야 할 때 자주 돌아가는 게시물입니다.

http://weblogs.asp.net/srkirkland/archive/2010/12/07/simple-msbuild-configuration-updating-assemblies-with-a-version-number.aspx

기본적으로, 당신의 MSBUILD의 PROJ 파일에 당신은 당신의 어셈블리 정보 파일을 변환 만듭니다. 같은 뭔가 :

로슬린 및 .NET 코어에서
msbuild myBuild.proj /p:Configuration="%config%" /p:build_number="%version%" 
0

, 컴파일러 소스 코드를 사용할 수 있습니다 : BUILD_NUMBER 외부에서 공급되는

<ItemGroup> 
    <RegexTransform Include="$(SolutionRoot)\CommonAssemblyInfo.cs"> 
     <Find>(?&lt;major&gt;\d+)\.(?&lt;minor&gt;\d+)\.\d+\.(?&lt;revision&gt;\d+)</Find> 
     <ReplaceWith>$(BUILD_NUMBER)</ReplaceWith> 
    </RegexTransform> 
</ItemGroup> 

.

파일 roslyn/src/Compilers/Core/Portable/VersionHelper.cs (https://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/Portable/VersionHelper.cs이 - 4f44984 on 2016-04-19 커밋에서) 방법 GenerateVersionFromPatternAndCurrentTime 원래 csc에서 같은 날짜의 논리가 않습니다

int revision = (int)time.TimeOfDay.TotalSeconds/2; 

// 24 * 60 * 60/2 = 43200 < 65535 
Debug.Assert(revision < ushort.MaxValue); 

// ... 

TimeSpan days = time.Date - new DateTime(2000, 1, 1); 
int build = Math.Min(ushort.MaxValue, (int)days.TotalDays); 

return new Version(pattern.Major, pattern.Minor, (ushort)build, (ushort)revision); 

그러나 문서 주석 단순히 "시간 기반 값"없는 말 어떻게 생성되는지에 대해 구체적입니다.

는 그러나 참으로, 지금까지 Build은 2000-01-01부터 계속 일이며 Revision 자정 이후의 초 수입니다.

흥미롭게도,이 동작 정의와 VersionHelperTests.cs에서 테스트 케이스에을 확인 : https://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/CodeAnalysisTest/VersionHelperTests.cs

관련 문제