我在非託管的Visual C++中編寫了一個DLL,並且在使用C#和C++應用程序時遇到了一些問題。下面是原型在C++ DLL的樣子:從託管代碼調用非託管DLL函數時出錯
extern "C" __declspec(dllexport) int WINAPI ZBNConnect(UCHAR dev, LPARAM hWnd, ZBCallbackFn rfn, ZBCallbackFn nfn, int DevType, byte * DevAddr, ZBCallbackFn dfn);
我的C#應用程序可以鏈接到的功能,沒有問題,但是,當它試圖調用一個拋出異常的函數:
catch (Exception e) { /* ... */ }
e.Message =「未將對象引用設置爲對象的實例。」
奇怪的是,如果我將WINAPI
帶出DLL中的原型,並重新編譯,C#應用程序將調用該函數而不會有任何問題。不幸的是,WINAPI
必須保留,因爲這是如何在C++應用程序中定義函數。
public delegate int ZBNConnectDelegate(uint dev, IntPtr hWnd, USBCallbackDelegate rfn, NotifyCallbackDelegate nfn, uint DevType, byte[] DevAddr, ZBdebugCallbackDelegate dfn);
public ZBNConnectDelegate ZBNConnect;
procName = "ZBNConnect";
fUintPtr = Kernel32.GetProcAddress(dllHandle, procName);
if (fUintPtr == UIntPtr.Zero)
{
throw new ArgumentException(procName);
}
fIntPtr = unchecked((IntPtr)(long)(ulong)fUintPtr);
ZBNConnect = (ZBNConnectDelegate)Marshal.GetDelegateForFunctionPointer(fIntPtr, typeof(ZBNConnectDelegate));
如何修改C#應用程序得到這個工作:
功能在C#應用程序一樣,這是目前的原型?謝謝。
編輯:附加信息
靜態鏈接([DllImport...]
)不是因爲這取決於哪個硬件附接至系統,支持連接的硬件是在運行時加載的不同DLL的選項。這兩個DLL都具有相同的API調用。
這不是DLL地獄,是完全不同的 – 2011-01-21 23:07:20
你試圖把外部原型? – bratao 2011-01-21 23:17:32
那麼,你如何初始化`ZBNConnect`並使其指向非託管函數呢?正如所寫,它將是`null`。爲什麼不使用P/Invoke(`[DllImport] static extern`)? – 2011-01-22 00:00:39