Насколько я знаю, нет класса в .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
, просто дайте мне знать.
Проверьте это - http://stackoverflow.com/questions/12647766/exporting-dll-functions-to-unmanaged-programs –
Мне это нужно наоборот, а не DLLExport, а DLLImport, который я использую динамически с помощью LoadLibrary и GetProcAddress win32api. – ZivF
Дело в том, что я получаю DLL из многих источников, а имена экспортируемых функций - это не всегда только имена исходных функций, но включают все другие типы материалов, такие как вопросительные знаки и «@», поэтому мне нужно получить список всех экспортированных имена функций, чтобы увидеть, какой из них содержит имя, которое я ищу – ZivF