Получение информации о продукте из неуправляемого выполняющегося приложения на C # / .NET

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

  •  11-07-2019
  •  | 
  •  

Вопрос

В C # можно получить информацию, связанную со сборкой, такую как название продукта, версия и т.д., Используя отражение:

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

Как мне сделать эквивалент, если исполняемая сборка написана на неуправляемом C ++ (скажем)?Возможно ли это вообще?Предположим, что у меня есть .NET dll, которая вызывается в неуправляемом коде через COM-интерфейс.

Редактировать:
Чтобы было абсолютно ясно, вот мой сценарий:

  • У меня есть исполняемый файл, написанный на неуправляемом C ++
  • У меня есть dll, написанная на C # / .NET
  • DLL вызывается исполняемым файлом через COM-интерфейс
  • В .NET dll я хочу иметь возможность извлекать информацию, такую как название продукта и версию вызывающего исполняемого файла.

Возможно?

Это было полезно?

Решение

Прогуливаясь по стеку, нет необходимости выяснять, в каком процессе вы находитесь.Вы просто выполняете один вызов Win32 API:

HMODULE hEXE = GetModuleHandle(NULL);

В соответствии с документация для этого вызова:

Если этот параметр равен НУЛЮ, GetModuleHandle возвращает дескриптор файла, используемого для создания вызывающего процесса (exe-файл).

Вы можете превратить этот дескриптор модуля в имя файла с GetModuleFileName() Получить имя файла(), еще один стандартный Win32 API.Имя файла в руке, затем вы можете вызвать GetFileVersionInfo() чтобы получить структуру VS_VERSIONINFO для этого файла.Информация, которая вам нужна, находится там.

Теперь, поскольку вы находитесь в .NET, вы могли бы использовать подписи P / Invoke для GetModuleHandle() GetModuleHandle(), GetModuleFileName() Получить имя файла().Для GetFileVersionInfo() вы можете использовать Система.Диагностика.FileVersionInfo.

Но на самом деле самый простой способ сделать это, вероятно, придерживаться System.Пространство имен Diagnostics, там есть все, что вам нужно.Звонить Система.Диагностика.Процесс.GetCurrentProcess() чтобы вернуть объект Process для процесса, в котором вы запущены.Затем вы можете извлечь ProcessModule из Основной модуль собственность.ProcessModule имеет свойство , называемое ФайлОверсиоНная информация.Информация, которая вам нужна, находится там.

Другие советы

вы могли бы использовать следующий код на 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

Добавьте ссылку COM на Microsoft Shell Controls and Automation в свой проект для компиляции.

Результатом работы вышеупомянутой программы будет список метаданных, присвоенных всем файлам в C: mp таких как

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:

Давайте предположим, что вам нужны данные PE заголовка EXE / DLL, которые возвращают вызовы @divo, напримерКомпания, Продукт и т.д...Эти, кстати.являются производными от вызова API информации о версии Win32 - подробности на 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top