Sí, es posible que deba hacer parte del trabajo que hace el contador de visitas P/Invocar. Cargando la DLL y encontrando el punto de entrada de la función exportada. Para empezar, se declara un delegado cuya firma coincide con la función exportada:
private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka);
A continuación, utilice un código como éste:
using System.ComponentModel;
using System.Runtime.InteropServices;
...
static IntPtr dllHandle;
...
if (dllHandle == IntPtr.Zero) {
dllHandle = LoadLibrary("mcs_apiD.dll");
if (dllHandle == IntPtr.Zero) throw new Win32Exception();
}
IntPtr addr = GetProcAddress(dllHandle, "[email protected]");
if (addr == IntPtr.Zero) throw new Win32Exception();
var func = (start_api)Marshal.GetDelegateForFunctionPointer(addr, typeof(start_api));
var retval = func(1, 2, 3, 4);
...
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string name);
montón de maneras de conseguir esto mal, por supuesto. Tenga en cuenta que debe usar el nombre exportado real de la DLL, ya no obtendrá la ayuda del marcador de P/Invoke para ayudar con la decoración del nombre. Use dumpbin.exe/exports en la DLL si no está seguro de cómo se ve el nombre de la exportación.
Ok. Pero en mi ejemplo he especificado un prototipo de función específico para que pueda ordenar los parámetros correctamente, algunas de las funciones de API tienen estructuras complejas como parámetros. ¿Cómo haría esto cuando trabaje de esta manera? – user226356
si los parámetros cambian de una versión de la DLL a otra, no tiene suerte con el método que mencioné –