Evet, bu mümkündür, P/Invoke marshaller'ın yaptığı işin bir kısmını yapmak zorundasınız. DLL yükleniyor ve verilen işlevin giriş noktasını bulmak. İmzasını ihraç işlevi eşleşen bir temsilci bildirirken başlayın:
private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka);
Sonra böyle kodu kullanın: Elbette bu yanlış elde etmenin yollarını
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);
sürü. Dışa aktarılan adı DLL'den kullanmanız gerektiğine dikkat edin, artık P/Invoke marshaller'in ad dekorasyonuna yardımcı olması için yardım almazsınız. Dışa aktarma adının neye benzediğinden emin değilseniz, dumpbin.exe/Export'u DLL'de kullanın.
Tamam. Ama benim örneğimde, parametreleri doğru şekilde seçebilmem için belirli bir işlev prototipini belirledim, bazı api işlevlerinin parametre olarak karmaşık yapıları var. Bu şekilde çalışırken bunu nasıl yapardım? – user226356
Parametreler DLL'nin bir sürümünden diğerine değişirse, GetProcAddress ile birlikte DLL API'sinin sürümü başına 1 delege türüyle, gerçekten –