ruso rusia que productos internacional importan importaciones importacion exportaciones exportacion exporta escasos economicos comercio colombia centro cei aliados c# c dll interop cdecl

c# - internacional - que productos se importan a rusia



C#obtiene la lista de exportaciones dll dll no administradas (1)

Tengo un dll C con funciones exportadas

Puedo usar la herramienta de línea de comandos dumpbin.exe / EXPORTS para extraer la lista de funciones exportadas y luego usarlas en mi código C # para llamar (con éxito) a estas funciones.

¿Hay alguna manera de obtener esta lista exported-functions-list directamente desde .NET, sin tener que usar una herramienta externa de línea de comandos?

Gracias


Por lo que yo sé, no existe una clase en .Net Framework que proporcione la información que necesita.

Sin embargo, puede usar los servicios de invocación de plataforma (PInvoke) de la plataforma .Net para usar las funciones de la DLL dbghelp.dll de Win32. Esta DLL es parte de las herramientas de depuración para la plataforma de Windows . La DLL dbghelp proporciona una función llamada SymEnumerateSymbols64 que le permite enumerar todos los símbolos exportados de una biblioteca de enlaces dinámicos. También hay una función más nueva llamada SymEnumSymbols que también permite enumerar los símbolos exportados.

El siguiente código muestra un ejemplo simple sobre cómo usar la función 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); }

Para mantener el ejemplo simple, no SymEnumSymbols función SymEnumSymbols . También hice el ejemplo sin usar clases como la clase SafeHandle del framework .Net. Si necesita un ejemplo para la función SymEnumSymbols , hágamelo saber.