Recuperación de información del producto de una aplicación de ejecución no administrada en C # /. NET

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

  •  11-07-2019
  •  | 
  •  

Pregunta

En C #, es posible recuperar información relacionada con el ensamblaje, como el nombre del producto, la versión, etc. mediante la reflexión:

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

¿Cómo hago el equivalente si el ensamblaje en ejecución está escrito en C ++ no administrado (digamos)? ¿Es posible? Suponga que tengo un .NET dll que se invoca en código no administrado a través de una interfaz COM.

editar:
Para dejar las cosas absolutamente claras, este es mi escenario:

  • Tengo un ejecutable escrito en C ++ no administrado
  • Tengo un dll escrito en C # /. NET
  • El dll es invocado por el ejecutable a través de una interfaz COM
  • Dentro de .NET dll quiero estar capaz de recuperar información como el nombre del producto y la versión de llamar ejecutable.

¿Posible?

¿Fue útil?

Solución

Recorrer la pila no es necesario para averiguar en qué proceso se encuentra. Simplemente haga una sola llamada a la API de Win32:

HMODULE hEXE = GetModuleHandle(NULL);

De acuerdo con la documentación para esta llamada :

  

Si este parámetro es NULL, GetModuleHandle devuelve un identificador al archivo utilizado para crear el proceso de llamada (archivo .exe).

Puede convertir este controlador de módulo en un nombre de archivo con GetModuleFileName () , otra API estándar de Win32. Nombre de archivo en la mano, puede llamar a GetFileVersionInfo () para recuperar la estructura VS_VERSIONINFO para ese archivo. La información que desea está ahí.

Ahora, dado que está en .NET, puede usar firmas P / Invoke para GetModuleHandle () , GetModuleFileName () . Para GetFileVersionInfo () puede usar System.Diagnostics.FileVersionInfo .

Pero en realidad la forma más fácil de hacerlo es, probablemente, apegarse al espacio de nombres System.Diagnostics, todo lo que necesita está ahí. Llame a System.Diagnostics.Process.GetCurrentProcess () para devolver un objeto Process para el proceso en el que se está ejecutando. Luego puede recuperar un ProcessModule desde propiedad MainModule . ProcessModule tiene una propiedad llamada FileVersionInfo . La información que desea está ahí.

Otros consejos

puede usar el siguiente código en VB.Net para recuperar las propiedades del documento extendido:

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

Agregue una referencia COM a Microsoft Shell Controls and Automation a su proyecto para compilar.

La salida del programa anterior será una lista de los metadatos asignados a todos los archivos en C: \ tmp como

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:

Supongamos que busca datos de encabezado PE de EXE / DLL que devuelven las llamadas de @ divo, p. ej. Empresa, producto, etc ... Estos por cierto. se derivan de llamar a la API de información de versión de Win32: detalles en MSDN:

  

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

El próximo desafío que enfrenta es enumerar la pila de llamadas para descubrir el contexto del módulo de la persona que llama. No lo he intentado, pero si examinas tu propia pila de llamadas, dudo que veas los marcos de la persona que llama no gestionada reunidos allí. Sospeche que se detiene en el marco de transición inyectado antes de cambiar a CCW. Además, dado que es COM, posiblemente la persona que llama podría llamar fuera de proceso; su persona que llama sería un proceso proxy.

Si eso falla, necesitaría las API de depuración para desenrollar la pila externa, eso introduce otras restricciones:

  • permisos de seguridad elevados necesarios para atravesar la pila
  • impacto potencial en el rendimiento que desenrolla la pila.

Llamada por llamada, cualquiera de estos podría hacer que el enfoque del depurador no sea práctico.

Update

Algunas investigaciones indican que hay muchos errores y problemas para leer la pila sobre el marco de transición CCW incluso en el depurador. p.ej.

  

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

La resolución de símbolos mixtos no administrados / administrados es bastante fea, algunas ideas aquí sobre cómo hacerlo ... El blog de DaveBr sobre depuración también es bastante impresionante.

  

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

Hay un montón de forraje en los pasos dados para ordenar las llamadas entre clientes no administrados / administrados, p.

  

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top