0

C# では、リフレクションを使用して製品名、バージョンなどのアセンブリ関連情報を取得できます。

string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();

実行中のアセンブリがアンマネージ C++ (たとえば) で記述されている場合、どのようにすればよいでしょうか? それは可能ですか?COM インターフェイスを介してアンマネージ コードで呼び出される .NET dll があるとします。

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

  • アンマネージ C++ で記述された実行可能ファイルがあります
  • C#/.NET で記述された dll があります。
  • dll は、COM インターフェイスを介して実行可能ファイルによって呼び出されます。
  • .NET dll 内で、呼び出し元の実行可能ファイルの製品名やバージョンなどの情報を取得できるようにしたいと考えています。

可能?

4

3 に答える 3

1

現在のプロセスを見つけるためにスタックをウォークする必要はありません。Win32API呼び出しを1回行うだけです。

HMODULE hEXE = GetModuleHandle(NULL);

この呼び出しのドキュメントによると:

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

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

これで、.NETを使用しているため、GetModuleHandle()GetModuleFileName( )にP/Invoke署名を使用できます。GetFileVersionInfo()の場合、System.Diagnostics.FileVersionInfoを使用できます。

しかし、実際にそれを行う最も簡単な方法は、おそらくSystem.Diagnostics名前空間に固執することであり、必要なものはすべてそこにあります。System.Diagnostics.Process.GetCurrentProcess()を呼び出して、実行中のプロセスのProcessオブジェクトを返します。次に、MainModuleプロパティからProcessModuleを取得できます。ProcessModuleには、 FileVersionInfoというプロパティがあります。あなたが欲しい情報はそこにあります。

于 2008-12-01T18:38:10.123 に答える
0

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

コンパイルするプロジェクトにMicrosoftShellControlsandAutomationへの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:
于 2008-12-01T09:01:53.720 に答える
0

@divoの呼び出しが会社、製品などを返すEXE / DLLのPEヘッダーデータの後にいると仮定しましょう...これらのところで。Win32 Version Info 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

于 2008-12-01T09:20:42.340 に答える