हां यह संभव है, आपको उस नौकरी का हिस्सा करना होगा जो पी/Invoc marshaller करता है। डीएलएल लोड हो रहा है और निर्यात किए गए फ़ंक्शन के प्रवेश बिंदु को ढूंढ रहा है। एक प्रतिनिधि जिनके हस्ताक्षर निर्यात समारोह से मेल खाता है की घोषणा के द्वारा शुरू करें:
private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka);
तो इस तरह कोड का उपयोग करें:
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);
तरीके निश्चित रूप से यह गलत पाने के लिए बहुत सारे। ध्यान दें कि आपको डीएलएल से वास्तविक निर्यात किए गए नाम का उपयोग करना है, अब आपको नाम सजावट में सहायता के लिए पी/इनवॉक मार्शलर से सहायता नहीं मिलती है। यदि आप सुनिश्चित नहीं हैं कि निर्यात नाम कैसा दिखता है तो DLL पर dumpbin.exe/निर्यात का उपयोग करें।
स्रोत
2010-05-12 12:58:35
ठीक है। लेकिन मेरे उदाहरण में मैंने एक विशिष्ट फ़ंक्शन प्रोटोटाइप निर्दिष्ट किया है ताकि मैं पैरामीटर को सही ढंग से मर्सल कर सकूं, कुछ एपीआई फ़ंक्शंस में पैरामीटर के रूप में जटिल संरचनाएं होती हैं। इस तरह से काम करते समय मैं यह कैसे करूँगा? – user226356
यदि पैरामीटर डीएलएल के एक संस्करण से दूसरे में बदलते हैं, तो आप –