Oui, cela est possible, vous devrez faire une partie du travail effectué par le P/Invoke marshaller. Chargement de la DLL et recherche du point d'entrée de la fonction exportée. Commencez en déclarant un délégué dont la signature correspond à la fonction exportée:
private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka);
Ensuite, utilisez le code comme ceci:
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);
Beaucoup de façons de se tromper bien sûr. Notez que vous devez utiliser le nom exporté réel de la DLL, vous ne recevez plus l'aide du marshaller P/Invoke pour aider à la décoration de nom. Utilisez dumpbin.exe/exports sur la DLL si vous ne savez pas à quoi ressemble le nom de l'exportation.
Ok. Mais dans mon exemple j'ai spécifié un prototype de fonction spécifique pour que je puisse correctement marsarchiser les paramètres, certaines des fonctions api ont des structures complexes en tant que paramètres. Comment ferais-je cela en travaillant de cette manière? – user226356
si les paramètres changent d'une version de la DLL à l'autre, vous n'avez pas de chance avec la méthode que j'ai mentionné –