조립품 파일 버전을 얻는 방법


727

에서 AssemblyInfo이 어셈블리 버전이 :

  1. AssemblyVersion: 기여할 어셈블리의 버전을 지정합니다.
  2. AssemblyFileVersion: Win32 파일 버전 리소스에 특정 버전 번호를 사용하도록 컴파일러에 지시합니다. Win32 파일 버전은 어셈블리의 버전 번호와 같을 필요는 없습니다.

Assembly Version다음 코드 줄로 얻을 수 있습니다 .

Version version = Assembly.GetEntryAssembly().GetName().Version;

하지만 어떻게 얻을 수 Assembly File Version있습니까?


2
"어셈블리 버전"과 반대로 "어셈블리 파일 버전"이란 무엇입니까? 예를 들어 줄 수 있습니까?
Xiaofu

7
@Xiaofu- "어셈블리 버전"은 .NET이 내부적으로 사용하는 것입니다. "어셈블리 파일 버전"은 파일을 마우스 오른쪽 버튼으로 클릭하고 "속성"으로 이동 한 다음 "세부 사항"탭으로 이동할 때 표시됩니다. 그들은 동일하지 않습니다.
rory.ap

AppData에서 user.config 위치를 결정할 때 어셈블리 버전이 사용되는 것으로 나타났습니다.
Kyle Delaney

답변:


867

당신이 정말로 원하는 것에 대한 설명을 요구하는 위의 내 의견을 참조하십시오. 잘만되면 이것은 다음과 같습니다.

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@ Xiaofu : AssemblyInfo.cs 파일에서 버전 번호를 얻는 방법이 있습니까?
Markus

56
이 코드의 한 가지 문제점은 빌드 및 개정 번호를 지정하지 않은 경우 실제로 1.0. *. *를 반환한다는 것입니다. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); 두 가지 버전을 동일하게 설정하는 경우 '컴파일 된'버전 번호를 얻을 수 있습니다. 이는 FileVersion과 동일해야합니다.
Doguhan Uluca

17
@DoguhanUluca 그들은 서로 다른 두 가지입니다. 파일 버전이 아닌 어셈블리 버전을 제공합니다. "두 버전을 같은 방식으로 설정하는 경우"는 해결책이 아니라 해결책입니다.
Nyerguds

1
않는 FileVersionInfo경우에만이 string속성과 어떤 Version속성을?
Kyle Delaney

3
@Yitzchak : Assembly.GetEntryAssembly()예를 들어 Office 추가 기능의 컨텍스트 및 기타 여러 경우에서 NULL을 반환합니다. 또한 addins / plugins에 대해 생각하면 EntryAssembly는 호스트 응용 프로그램이며 가장 자주 YourCode (TM) 버전을 원합니다. 그 외에도이 답변에 추가 할 가치가 assembly.Location있습니다. (즉, 첫 번째 무작위 사례는 github.com/Azure/azure-functions-host/issues/1233으로 나타 났으며 ) 아마도 null 엔트리 어셈블리를 사용하는 것보다 훨씬 자주 발생합니다.
quetzalcoatl

209

가 있습니다 세 가지 버전 : 조립 , 파일제품 . 그것들은 다른 기능에서 사용되며 명시 적으로 지정하지 않으면 다른 기본값을 사용합니다.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

17
해당 블로그 게시물이 언젠가 사라지면 여기에 참고 용으로 정리되어 있습니다.string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD

3
AssemblyInfo.cs 파일에서 이들을 지정하려는 경우 assemblyVersion 사용 (원하는 숫자) === [assembly: AssemblyVersion("2.0.*")]fileVersion 사용 === [assembly: AssemblyFileVersion("2.0.*")]및 productVersion 사용 === [assembly: AssemblyInformationalVersion("2.0.*")] 마지막으로 SemVer호환성을 위해 문자열 접미사를 사용할 수 있습니다 .[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm

부록 : 접미사 표기법을 AssemblyFileVersion사용하지 않을 수 있습니다 *. :(이 숫자는 모두 4 개가 필요합니다.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm

66

응용 프로그램 파일 버전 (어셈블리 정보-> 파일 버전에서 설정)에 액세스하려는 경우 버전을 표시하기 위해 양식로드시 레이블 텍스트를 레이블 텍스트로 설정하려고합니다.

versionlabel.Text = "Version " + Application.ProductVersion;

53
여기에는 System.Windows.Forms에 대한 참조가 필요하므로 일부 응용 프로그램에는 적합하지 않을 수 있습니다.
BradleyDotNET

2
불행히도, 그것은 문자열입니다. 보다 간단한 "v1.08"형식으로 직접 포맷하려면 이상적이지 않습니다. 하위 구성 요소를 정수로 가져 오기 위해 실제로 버전 객체를 얻는다면 훨씬 더 편리합니다.
Nyerguds

1
또한, 어셈블리 정보,하지 AssemblyVersion에서 AssemblyFileVersion까지이 종목은, 그래서 조심
dario_ramos

높은 담당자가이 답변을 편집하여 Windows Forms 전용이라는 것을보다 명확하게 할 수 있습니까?
jrh

이것은 내가 찾던 것입니다. 답변에 감사드립니다!
David Refoua

23

업데이트 : 내가 인용 한 게시물 @Iain 및 @Dmitry Lobanov 에서 Richard Grimes가 언급했듯이 내 대답은 이론적으로는 맞지만 실제로는 틀립니다.

셀 수없이 많은 책들에서 기억했듯이,를 사용하여 이러한 속성을 설정하는 동안 [assembly: XXXAttribute]컴파일러에 의해 하이재킹되어 VERSIONINFO리소스에 배치됩니다 .

위의 이유로 신호가 추출 된 후 속성이 제거되므로 @Xiaofu의 답변에 접근 방식을 사용해야 합니다.


공개 정적 문자열 GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) 어셈블리
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .단일();
   속성을 반환합니다.
}

( http://bytes.com/groups/net/420417-assemblyversionattribute에서 -다른 속성을 찾고 있다면 위의 속성으로 대체하십시오)


안녕 루벤, 노트 2 개 먼저 질문은 AssemblyVersion이 아닌 AssemblyFileVersion을 요청했습니다. 둘째, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true)는 길이가 0 인 배열을 반환합니다. AssemblyVersionAttribute가 사용자 지정 특성이 아니기 때문이라고 생각합니다.
Iain

첫 번째 요점으로, "왜 다른 속성을 찾고 있다면 위의 속성으로 대체하십시오"(IIRC는 시도하지 않았습니다). 에 파고 그럴듯하게 보인다하지만 시간이 해달라고 두 번째, ... 재
루벤 Bartelink

예, 실제로는 .GetCustomAttribute ()를 통해 AssemblyVersion 속성을 가져올 수 없으며 속성을 통해서만 어셈블리 버전을 검색 할 수 있습니다 AssemblyName.Version. 그러나 다른 모든 속성과 함께 그것을 수행하는 올바른 방법입니다
Dmitrii Lobanov

@DmitryLobanov와 Iain 프롬프트에 감사드립니다. 편집이 삭제하는 대신 유지할 가치가있는 답변을 충분히 포함하기를 바랍니다. 알려주세요!
Ruben Bartelink

1
나는 .net core 3.1 AssemblyInformationalVersionAttribute대신에 사용 했다AssemblyVersionAttribute
Vasya Milovidov

5

이것을 사용하십시오 :

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

아니면 이거:

new Version(System.Windows.Forms.Application.ProductVersion);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.