Récupération d'informations de produit à partir d'une application d'exécution non gérée en C # / .NET

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

  •  11-07-2019
  •  | 
  •  

Question

En C #, il est possible de récupérer des informations relatives à l'assemblage telles que le nom du produit, la version, etc. à l'aide de la réflexion:

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

Comment puis-je faire l'équivalent si l'assembly d'exécution est écrit en C ++ non géré (par exemple)? Est-ce même possible? Supposons que je dispose d'une dll .NET invoquée dans du code non managé via une interface COM.

modifier:
Pour que les choses soient bien claires, voici mon scénario:

  • j'ai un exécutable écrit en C ++ non géré
  • j'ai écrit une dll en C # / .NET
  • La dll est invoquée par le exécutable via une interface COM
  • Je veux être dans la dll .NET capable de récupérer des informations comme le nom du produit et la version du appelant l'exécutable.

Possible?

Était-ce utile?

La solution

Il n'est pas nécessaire de consulter la pile pour savoir dans quel processus vous vous trouvez. Vous effectuez simplement un seul appel d'API Win32:

HMODULE hEXE = GetModuleHandle(NULL);

Selon la documentation sur cet appel :

  

Si ce paramètre est NULL, GetModuleHandle renvoie un descripteur au fichier utilisé pour créer le processus appelant (fichier .exe).

Vous pouvez transformer ce descripteur de module en un nom de fichier avec GetModuleFileName () , une autre API Win32 standard. Nom de fichier en main, vous pouvez ensuite appeler GetFileVersionInfo () pour récupérer la structure VS_VERSIONINFO pour ce fichier. Les informations que vous souhaitez y figurent.

Maintenant que vous êtes dans .NET, vous pouvez utiliser les signatures P / Invoke pour GetModuleHandle () , GetModuleFileName () . Pour GetFileVersionInfo (), vous pouvez utiliser System.Diagnostics.FileVersionInfo .

Mais en réalité, la façon la plus simple de le faire est probablement de rester avec l’espace de noms System.Diagnostics, tout ce dont vous avez besoin est là. Appelez System.Diagnostics.Process.GetCurrentProcess () pour renvoyer un objet Processus au processus dans lequel vous vous exécutez. Ensuite, vous pouvez récupérer un ProcessModule à partir du MainModule . ProcessModule a une propriété appelée FileVersionInfo . Les informations que vous souhaitez sont là.

Autres conseils

vous pouvez utiliser le code suivant dans VB.Net pour récupérer les propriétés de document étendues:

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

Ajoutez une référence COM à Microsoft Shell Controls and Automation à votre projet à compiler.

La sortie du programme ci-dessus sera une liste des métadonnées affectées à tous les fichiers de C: \ tmp, tels que

.
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:

Supposons que vous recherchez les données d'en-tête PE d'un EXE / DLL que les appels de @ divo renvoient, par exemple. Société, produit, etc. sont dérivés de l'appel des API d'informations de version Win32 - plus de détails sur MSDN:

  

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

Le prochain défi à relever consiste à énumérer la pile d'appels pour découvrir le contexte du module de votre appelant. Je n'ai pas essayé - mais si vous examinez votre propre poste d'appels, je doute que vous voyiez les trames de l'appelant non gérées rassemblées. Suspectez qu'il s'arrête à la trame de transition injectée avant de basculer dans le CCW. De plus, étant donné que c'est COM, l'appelant pourrait appeler de l'extérieur du processus - votre appelant serait un processus proxy.

Si cela échoue - vous aurez besoin de l'API de débogage pour dérouler la pile externe - cela introduit d'autres contraintes:

  • autorisations de sécurité élevées requises pour parcourir la pile
  • impact potentiel sur les performances lors du dépilage de la pile.

Sur une base individuelle, l'un ou l'autre pourrait rendre l'approche du débogueur peu pratique.

Mettre à jour

Certaines recherches indiquent qu'il existe de nombreux bogues et erreurs pour lire la pile au-dessus du cadre de transition CCW, même dans le débogueur. par exemple.

  

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

La résolution de symbole mixte non gérée / gérée est assez moche - quelques réflexions ici sur la façon de le faire ... Le blog de DaveBr sur le débogage est également génial.

  

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

     

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

Il y a beaucoup de matière sur les étapes suivies pour organiser les appels entre clients non gérés / gérés - par exemple.

  

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top