Abrufen von Produktinformation aus einer nicht verwalteten Ausführungsanwendung in C # /. NET
Frage
In C # ist es möglich, Montag bezogene Informationen wie Produktname, Version usw. mithilfe von Reflektion abzurufen:
string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();
Wie mache ich das Äquivalent, wenn die ausführende Assembly in nicht verwalteten C ++ geschrieben ist (sagen wir)? Ist es überhaupt möglich? Es sei angenommen, dass ich eine .NET-DLL haben, die in nicht verwalteten Code über eine COM-Schnittstelle aufgerufen wird.
Bearbeiten
Um die Dinge absolut klar zu machen, das ist mein Szenario:
- Ich habe eine ausführbare Datei geschrieben unmanaged C ++
- Ich habe eine DLL geschrieben in C # /. NET
- Die DLL wird durch die aufgerufene ausführbare Datei über eine COM-Schnittstelle
- In der .NET-DLL ich sein will abrufen können Informationen wie die Produktnamen und die Version der Aufruf ausführbare Datei.
möglich?
Lösung
Gehen des Stapels ist nicht notwendig, um herauszufinden, was Prozess, den Sie sind in Sie einfach einen einzelnen Win32-API-Aufruf machen.
HMODULE hEXE = GetModuleHandle(NULL);
Nach der Dokumentation für diesen Aufruf :
Wenn diese Parameter NULL sind, gibt GetModuleHandle einen Griff in die Datei verwendet, um den Anrufprozess (EXE-Datei) zu erstellen.
Sie können machen dieses Modul-Handle in einen Dateinamen mit GetModuleFileName () , ein anderer Standard Win32 API. Dateiname in der Hand, können Sie rufen Sie GetFileVersionInfo () die VS_VERSIONINFO Struktur für diese Datei abzurufen. Die Informationen, die Sie wollen, ist da drin.
Nun, da Sie in .NET sind, könnten Sie P / Invoke Unterschriften für GetModuleHandle () , GetModuleFileName () . Für GetFileVersionInfo () Sie System.Diagnostics.FileVersionInfo .
Aber eigentlich die einfachste Art und Weise zu tun, ist es wahrscheinlich mit dem Namespace System.Diagnostics zu bleiben, gibt es alles, was man braucht. Rufen Sie System.Diagnostics.Process.GetCurrentProcess () ein Prozessobjekt für den Prozess zurückzukehren, die Sie in laufen. Dann können Sie eine Process aus dem MainModule Eigenschaft. Process hat eine Eigenschaft namens Fileversioninfo. Die Informationen, die Sie wollen, ist es.
Andere Tipps
können Sie den folgenden Code in VB.Net verwenden, um erweiterte Dokumenteigenschaften abrufen:
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
Fügen Sie einen COM-Verweis auf Microsoft Shell Bedienelemente und Automation zu einem Projekt zu kompilieren.
Die Ausgabe des obigen Programms wird eine Liste der Meta auf alle Dateien in C zugeordneten Daten: \ tmp wie
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:
Nehmen wir an, Sie sind nach einer EXE / DLL PE-Header-Daten, dass @ divo die Anrufe zurückkehren z Unternehmen, Produkt etc ... btw Diese. Win32 Version Info-API abgeleitet wird von Aufrufen - Details bis auf MSDN:
Die nächste Herausforderung Sie Gesicht ist Aufzählen die Aufrufhierarchie Ihres Anrufers Modul Kontext zu entdecken. Ich habe nicht versucht - aber wenn Sie Ihre eigene Aufrufliste prüfen, bezweifle ich, werden Sie den nicht verwalteten Anrufers Rahmen vermarshallten in dort sehen. Vermuten, dass sie an Übergangsrahmen stoppt injiziert, bevor sie in der CCW-Schalt. Auch, da es COM ist, möglicherweise der Anrufer von außerhalb des Prozesses nennen könnte -. Ihre Anrufer wäre ein Proxy-Prozess
Wenn die fehlschlägt - Sie das den externen Stapel entspannen Debugging-API benötigen würden -, die anderen Einschränkungen führt:
- erhöhte Sicherheitsberechtigungen erforderlich, um den Stapel zu durchqueren
- mögliche Auswirkungen auf die Leistung Abwickeln des Stapels.
Auf einem Call-by-Call-Basis entweder dieser könnte den Debugger Ansatz unpraktisch machen.
Aktualisieren
Einige Untersuchungen zeigen, gibt es viele Bugs und gotchas zum Lesen des Stapels über dem CCW Gangsrahmen auch im Debugger. z.B.
Mixed Unmanaged / Managed Symbol Auflösung ist ziemlich hässlich - einige Gedanken hier, wie es geht ... DaveBr Blog auf das Debuggen zu ziemlich genial ist
.Es gibt viel Futter auf die unternommenen Schritte Anrufe zwischen unmanaged / verwalteten Clients Rangier - z.B.