2013-08-15 3 views
4

у меня есть библиотека C с экспортируемыми функциямиC# получить список экспорта DLL неуправляемых C

я могу использовать инструмент командной строку dumpbin.exe/ЭКСПОРТ для извлечения списка экспортируемых функций, а затем использовать их в мой код C# (успешно) вызывает эти функции.

Есть ли способ получить этот список экспортированных функций непосредственно из .NET, без необходимости использовать внешний инструмент командной строки?

Благодаря

+1

Проверьте это - http://stackoverflow.com/questions/12647766/exporting-dll-functions-to-unmanaged-programs –

+0

Мне это нужно наоборот, а не DLLExport, а DLLImport, который я использую динамически с помощью LoadLibrary и GetProcAddress win32api. – ZivF

+0

Дело в том, что я получаю DLL из многих источников, а имена экспортируемых функций - это не всегда только имена исходных функций, но включают все другие типы материалов, такие как вопросительные знаки и «@», поэтому мне нужно получить список всех экспортированных имена функций, чтобы увидеть, какой из них содержит имя, которое я ищу – ZivF

ответ

4

Насколько я знаю, нет класса в .Net Framework, которая обеспечивает необходимую вам информацию.

Однако вы можете использовать платформу Призыва услуг (PInvoke) платформы .Net, чтобы использовать функции Win32 DBGHELP.DLL DLL. Эта DLL является частью Инструменты отладки для платформы Windows. DLL dbghelp предоставляет функцию с именем SymEnumerateSymbols64, которая позволяет вам перечислять все экспортированные символы библиотеки динамических ссылок . Существует также новая функция , называемая SymEnumSymbols, которая также позволяет перечислять экспортированных символов.

В приведенном ниже коде представлен простой пример использования функции SymEnumerateSymbols64 .

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SymInitialize(IntPtr hProcess, string UserSearchPath, [MarshalAs(UnmanagedType.Bool)]bool fInvadeProcess); 

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SymCleanup(IntPtr hProcess); 

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile, 
    string ImageName, string ModuleName, long BaseOfDll, int DllSize, IntPtr Data, int Flags); 

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SymEnumerateSymbols64(IntPtr hProcess, 
    ulong BaseOfDll, SymEnumerateSymbolsProc64 EnumSymbolsCallback, IntPtr UserContext); 

public delegate bool SymEnumerateSymbolsProc64(string SymbolName, 
     ulong SymbolAddress, uint SymbolSize, IntPtr UserContext); 

public static bool EnumSyms(string name, ulong address, uint size, IntPtr context) 
{ 
    Console.Out.WriteLine(name); 
    return true; 
}  

static void Main(string[] args) 
{ 
    IntPtr hCurrentProcess = Process.GetCurrentProcess().Handle; 

    ulong baseOfDll; 
    bool status; 

    // Initialize sym. 
    // Please read the remarks on MSDN for the hProcess 
    // parameter. 
    status = SymInitialize(hCurrentProcess, null, false); 

    if (status == false) 
    { 
    Console.Out.WriteLine("Failed to initialize sym."); 
    return; 
    } 

    // Load dll. 
    baseOfDll = SymLoadModuleEx(hCurrentProcess, 
           IntPtr.Zero, 
           "c:\\windows\\system32\\user32.dll", 
           null, 
           0, 
           0, 
           IntPtr.Zero, 
           0); 

    if (baseOfDll == 0) 
    { 
    Console.Out.WriteLine("Failed to load module."); 
    SymCleanup(hCurrentProcess); 
    return; 
    } 

    // Enumerate symbols. For every symbol the 
    // callback method EnumSyms is called. 
    if (SymEnumerateSymbols64(hCurrentProcess, 
     BaseOfDll, EnumSyms, IntPtr.Zero) == false) 
    { 
    Console.Out.WriteLine("Failed to enum symbols."); 
    } 

    // Cleanup. 
    SymCleanup(hCurrentProcess); 
} 

Для того, чтобы этот пример просто я не использовал функцию SymEnumSymbols. Я также сделал пример без использования таких классов, как класс SafeHandle .Net framework. Если вам нужен пример функции SymEnumSymbols, просто дайте мне знать.

+0

Большое спасибо за информацию о освещении, я ее протестировал и, похоже, работает нормально. – ZivF

+0

Еще одна вещь, которая отсутствует для меня функционально, - это возможность получить имя точки входа для каждого из перечисленных имен функций, это потому, что, например, функция с именем «GGT_RecommendMacros» имеет точка входа с именем «? GGT_RecommendMacros @@ YAPADPBDPAHPAPAPAD @ Z» – ZivF

+0

@ZivF: «GGT_RecommendMacros @@ ..» является украшением имен C++. Это точка входа вашей функции. См. http://stackoverflow.com/questions/14085396/dumpbin-show-strange-method-name-generate-export-function-in-ms-visual-c для дальнейшего объяснения. – Hans

Смежные вопросы