2011-03-28 2 views
0

나는 C#을 사용하여 파일 버전을 얻기 위해 노력하고 있어요 :FileVersionInfo.FileVersion은 ProductVersion을 반환합니까?

string file = @"C:\somefile.dll"; 
Console.WriteLine(FileVersionInfo.GetVersionInfo(file).FileVersion); 

대부분의 파일의 경우이 괜찮습니다,하지만 일부 내가 Windows 파일 탐색기에서 제시 한 것보다 다른 결과를받을 수 있습니다.

첨부 된 이미지보기 : Windows에 표시된 파일 버전은 "0.0.0.0"이지만 FileVersion 속성을 사용하는 파일 버전은 "000.000.000.000"입니다.

같은 결과를주는 다른 버전의 .NET (2, 3.5, 4)을 사용해 보았습니다.

누구든지이 문제가 발생 했습니까?

감사 리 오르

enter image description here

+0

하여 Windows 탐색기 이미지에 열이 무엇입니까? 첫 번째 '버전'열은 무엇이며 어떤 것이 두 번째입니까? –

+0

첫 번째 파일 버전입니다. 두 번째는 "제품 버전"입니다. –

+0

코드에서 Windows의 "제품 버전"에 표시된 것과 동일한 FileVersion 속성을 얻고 있습니다. –

답변

1

Windows 탐색기 버전 부품의 선도적 인 0을 제거하는 것 같다.

FileVersion 001.001.001.001을 사용하여 어셈블리를 만들면 탐색기에 1.1.1.1로 표시됩니다. 그러나 코드는 실제 값 (001.001.001.001)을 반환합니다.

편집 :

탐색기 PRODUCTVERSION로 001.001.001.001를 반환하지만 AssemblyInformationalVersion가 설정되지 않은 경우에만,이 경우는 PRODUCTVERSION로 그를 반환합니다.

+0

제안 된 버전으로 어셈블리를 만들었습니다. Indded, explorer는 "1.1.1.1"을 파일 버전과 제품 버전으로 보여줍니다. –

+0

문제는 다른 API가 이러한 주요 0을 제거하여 이들과 FileVersion 사이의 비교 중 일부가 실패한 것입니다. –

+0

가상 -1. 답이 잘못되었습니다. 버전은 001.001이 아니며 실제로는 000.000.000.000입니다. 이 문자열, 내 대답을 참조하십시오. – Aliostad

1

이유는 WIN32 API (및 파일 메타 데이터)에서 제품 버전은 문자열로 정의되지만 파일 버전은 정수로 정의되지만 .NET에서는 모두 정수로 정의됩니다. 당신이 반사경을 사용하고 FileVersionInfo 클래스를 검사 할 경우

, 당신은 그들이 다르게로드되었는지 볼 수 있습니다

this.productVersion = GetFileVersionString(memIntPtr, string.Format(CultureInfo.InvariantCulture, format, new object[] { codepage, "ProductVersion" })) 

하지만을 :

this.fileMajor = HIWORD(fixedFileInfo.dwFileVersionMS); 
this.fileMinor = LOWORD(fixedFileInfo.dwFileVersionMS); 
this.fileBuild = HIWORD(fixedFileInfo.dwFileVersionLS); 
this.filePrivate = LOWORD(fixedFileInfo.dwFileVersionLS); 
+0

WIN32에서 정수로 정의 된 경우 정수가 문자열로 변환되는 방법은 다음과 같습니다. 선행 제로? 문자열의 int 표현으로 변환되어 있어야합니다. –

+0

당신은 제품 정보가 아니라 파일 정보 (의견에 제품 정보가 두 번째 것임을 말함) – Aliostad

+0

windows의 파일 버전 = "0.0.0.0", windows의 제품 버전 = "000.000.000.000". .NET에서 그들은 "000.000.000.000"을 반환합니다. WIN32에 따르면 파일 버전이 INT로 이루어진 경우 .NET에서 검색 할 때 후행 0이 어디에서 오는가? NET에서 "000"이 아닌 "0"으로 문자열을 구문 분석 할 것으로 예상됩니다. –

관련 문제