Abrufen von Produktinformation aus einer nicht verwalteten Ausführungsanwendung in C # /. NET

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

  •  11-07-2019
  •  | 
  •  

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?

War es hilfreich?

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:

  

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

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.

  

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

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

.
  

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

Es gibt viel Futter auf die unternommenen Schritte Anrufe zwischen unmanaged / verwalteten Clients Rangier - z.B.

  

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top