C#/. Net에서 관리되지 않는 실행 애플리케이션에서 제품 정보 검색

StackOverflow https://stackoverflow.com/questions/330115

  •  11-07-2019
  •  | 
  •  

문제

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의 세부 사항을 호출하는 데 파생됩니다.

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

다음 도전은 콜 스택을 열거하여 발신자의 모듈 컨텍스트를 발견하는 것입니다. 나는 시도하지 않았지만 자신의 CallStack을 검사하면 관리되지 않는 발신자의 프레임이 거기에 마샬링 된 것을 볼 수있을 것입니다. CCW로 전환하기 전에 주입 된 전환 프레임에서 멈추는 것으로 의심됩니다. 또한 COM이기 때문에 호출자는 프로세스를 벗어나서 호출 할 수 있습니다. 발신자는 프록시 프로세스가 될 것입니다.

실패한 경우 - 다른 제약 조건을 소개하는 외부 스택을 풀기 위해 디버깅 API가 필요합니다.

  • 스택을 가로 지르는 데 필요한 보안 권한이 높아집니다
  • 잠재적 성능 영향 스택 풀기.

전화별로 콜에 걸쳐서이 중 하나는 디버거 접근 방식을 실용적으로 만들 수 있습니다.

업데이트

일부 연구에 따르면 디버거에서도 CCW 전이 프레임 위의 스택을 읽을 수있는 버그와 gotchas가 많이 있습니다. 예를 들어

http://support.microsoft.com/kb/317221

혼합되지 않은/관리되는 기호 해상도는 매우 추악합니다.

http://bytes.com/groups/net-vc/280340-stackwalk-callstack-symbol-resolve-unmanaged-code-dbghelp-etc

http://blogs.msdn.com/davbr/archive/2005/10/06/478006.aspx

관리되지 않는 고객 간의 마샬링 호출 단계에 대한 많은 사료가 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top