C#/. Net에서 관리되지 않는 실행 애플리케이션에서 제품 정보 검색
문제
C#에서는 반사를 사용하여 제품 이름, 버전 등과 같은 어셈블리 관련 정보를 검색 할 수 있습니다.
string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();
실행 어셈블리가 관리되지 않는 C ++ (SAY)로 작성된 경우 동등한 방법을 어떻게합니까? 가능합니까? COM 인터페이스를 통해 관리되지 않는 코드로 호출되는 .NET DLL이 있다고 가정합니다.
편집하다:
일을 절대적으로 명확하게하기 위해 이것이 나의 시나리오입니다.
- 관리되지 않는 C ++로 작성된 실행 파일이 있습니다
- C#/. Net으로 작성된 DLL이 있습니다.
- DLL은 COM 인터페이스를 통해 실행 파일에 의해 호출됩니다.
- .NET DLL 내에서 제품 이름 및 호출 실행 파일의 버전과 같은 정보를 검색하고 싶습니다.
가능한?
해결책
스택을 걷는 것이 어떤 프로세스에 있는지 찾기 위해 필요하지 않습니다. 단일 Win32 API 호출을 만듭니다.
HMODULE hEXE = GetModuleHandle(NULL);
에 따르면 이 호출에 대한 문서:
이 매개 변수가 NULL 인 경우 GetModuleAndle은 호출 프로세스 (.exe 파일)를 작성하는 데 사용되는 파일에 핸들을 반환합니다.
이 모듈 핸들을 다음과 함께 파일 이름으로 바꿀 수 있습니다. getModuleFilename (), 또 다른 표준 Win32 API. 파일 이름을 손에 넣으면 전화 할 수 있습니다 getFileVersionInfo () 해당 파일의 vs_versioninfo 구조를 검색합니다. 원하는 정보가 있습니다.
이제 .net에 있기 때문에 p/invoke 서명을 사용할 수 있습니다. getModuleHandle (), getModuleFilename (). getFileVersionInfo ()의 경우 사용할 수 있습니다 System.diagnostics.fileversioninfo.
그러나 실제로 가장 쉬운 방법은 아마도 시스템을 고수하는 것입니다. 진단 네임 스페이스, 필요한 모든 것이 있습니다. 부르다 System.diagnostics.process.getCurrentProcess () 실행중인 프로세스의 프로세스 개체를 반환하려면 프로세스 모드를 검색 할 수 있습니다. 메인 모드 재산. ProcessModule에는 호출 된 속성이 있습니다 FileVersionInfo. 원하는 정보가 있습니다.
다른 팁
vb.net의 다음 코드를 사용하여 확장 된 문서 속성을 검색 할 수 있습니다.
Sub Main()
Dim arrHeaders(41)
Dim shell As New Shell32.Shell
Dim objFolder As Shell32.Folder
objFolder = shell.NameSpace("C:\tmp\")
For i = 0 To 40
arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
Next
For Each strFileName In objfolder.Items
For i = 0 To 40
Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objFolder.GetDetailsOf(strFileName, i))
Next
Next
End Sub
Microsoft Shell 컨트롤 및 자동화에 대한 COM 참조를 프로젝트에 추가하여 컴파일하십시오.
위 프로그램의 출력은 C : TMP의 모든 파일에 할당 된 메타 데이터 목록이됩니다.
0 Name: dpvoice.dll
1 Size: 208 KB
2 Type: Application Extension
3 Date Modified: 14.04.2008 04:41
4 Date Created: 14.04.2008 04:41
5 Date Accessed: 01.12.2008 09:56
6 Attributes: A
7 Status: Online
8 Owner: Administrators
9 Author:
10 Title:
11 Subject:
12 Category:
13 Pages:
14 Comments:
15 Copyright:
16 Artist:
17 Album Title:
18 Year:
19 Track Number:
20 Genre:
21 Duration:
22 Bit Rate:
23 Protected:
24 Camera Model:
25 Date Picture Taken:
26 Dimensions:
27 :
28 :
29 Episode Name:
30 Program Description:
31 :
32 Audio sample size:
33 Audio sample rate:
34 Channels:
35 Company: Microsoft Corporation
36 Description: Microsoft DirectPlay Voice
37 File Version: 5.3.2600.5512
38 Product Name: Microsoftr Windowsr Operating System
39 Product Version: 5.03.2600.5512
40 Keywords:
@divo의 호출이 회사, 제품 등을 반환한다는 EXE/DLL의 PE 헤더 데이터를 받고 있다고 가정 해 봅시다. MSDN에서 Win32 버전 정보 API의 세부 사항을 호출하는 데 파생됩니다.
다음 도전은 콜 스택을 열거하여 발신자의 모듈 컨텍스트를 발견하는 것입니다. 나는 시도하지 않았지만 자신의 CallStack을 검사하면 관리되지 않는 발신자의 프레임이 거기에 마샬링 된 것을 볼 수있을 것입니다. CCW로 전환하기 전에 주입 된 전환 프레임에서 멈추는 것으로 의심됩니다. 또한 COM이기 때문에 호출자는 프로세스를 벗어나서 호출 할 수 있습니다. 발신자는 프록시 프로세스가 될 것입니다.
실패한 경우 - 다른 제약 조건을 소개하는 외부 스택을 풀기 위해 디버깅 API가 필요합니다.
- 스택을 가로 지르는 데 필요한 보안 권한이 높아집니다
- 잠재적 성능 영향 스택 풀기.
전화별로 콜에 걸쳐서이 중 하나는 디버거 접근 방식을 실용적으로 만들 수 있습니다.
업데이트
일부 연구에 따르면 디버거에서도 CCW 전이 프레임 위의 스택을 읽을 수있는 버그와 gotchas가 많이 있습니다. 예를 들어
혼합되지 않은/관리되는 기호 해상도는 매우 추악합니다.
http://bytes.com/groups/net-vc/280340-stackwalk-callstack-symbol-resolve-unmanaged-code-dbghelp-etc
관리되지 않는 고객 간의 마샬링 호출 단계에 대한 많은 사료가 있습니다.