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 ++(たとえば)で記述されている場合、同等の操作を行うにはどうすればよいですか?それも可能ですか? COMインターフェイスを介してアンマネージコードで呼び出される.NET dllがあると仮定します。

編集:
物事を明確にするために、これが私のシナリオです:

  • 実行可能ファイルが書かれています アンマネージC ++
  • dllが書かれています C#/。NETで
  • dllは COMインターフェース経由で実行可能
  • .NET DLL内になりたい のような情報を取得することができます 製品名とバージョン 実行可能ファイルの呼び出し。

可能ですか?

役に立ちましたか?

解決

現在のプロセスを調べるためにスタックを歩く必要はありません。Win32APIを1回呼び出すだけです:

HMODULE hEXE = GetModuleHandle(NULL);

この呼び出しのドキュメント

  

このパラメーターがNULLの場合、GetModuleHandleは呼び出しプロセスの作成に使用されるファイル(.exeファイル)へのハンドルを返します。

を使用して、このモジュールハンドルをファイル名に変換できます。 GetModuleFileName()、別の標準Win32 API。ファイル名を入手したら、 GetFileVersionInfo()を使用して、そのファイルのVS_VERSIONINFO構造を取得します。必要な情報はそこにあります。

.NETにいるので、 GetModuleHandle() GetModuleFileName()。 GetFileVersionInfo()の場合、 System.Diagnostics.FileVersionInfo

しかし、実際にそれを行う最も簡単な方法は、おそらくSystem.Diagnostics名前空間に固執することです。必要なものはすべて揃っています。 System.Diagnostics.Process.GetCurrentProcess()を使用して、実行中のプロセスのProcessオブジェクトを返します。次に、 MainModule プロパティ。 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 Controls and Automationへの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:

EXE / DLLのPEヘッダーデータの後にいると仮定しましょう。@ divoの呼び出しは、たとえば会社、製品など...これらのところで。 Win32バージョン情報APIの呼び出しから派生しています-詳細はMSDNで:

  

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

次に直面する課題は、呼び出しスタックを列挙して、呼び出し元のモジュールコンテキストを検出することです。試したことはありませんが、独自のコールスタックを調べてみると、アンマネージドの呼び出し元のフレームがそこにマーシャリングされているのが見えないでしょう。 CCWに切り替える前に注入された移行フレームで停止すると思われます。また、COMであるため、呼び出し元はプロセス外から呼び出すことができます。呼び出し元はプロキシプロセスになります。

それが失敗した場合-外部スタックを解くにはデバッグAPIが必要です-他の制約を導入します:

  • スタックをトラバースするために必要なセキュリティ権限の強化
  • 潜在的なパフォーマンスはスタックの巻き戻しに影響します。

コールごとにこれらのいずれかを使用すると、デバッガーのアプローチが実用的でなくなる可能性があります。

更新

いくつかの調査では、デバッガーであってもCCW移行フレームの上のスタックを読み取るためのバグや落とし穴がたくさんあることが示されています。例えば

  

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

混合アンマネージド/マネージドシンボル解決は非常にいです-方法についてのいくつかの考え...デバッグに関するDaveBrのブログも非常に素晴らしいです。

  

http ://bytes.com/groups/net-vc/280340-stackwalk-callstack-symbol-resolve-managed-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