アンマネージ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 = "オブジェクト参照がオブジェクトのインスタンスに設定されていません。"
奇妙なことに、DLLのプロトタイプからWINAPI
を取り出して再コンパイルすると、C#アプリケーションは問題なくこの関数を呼び出します。残念ながら、WINAPI
は、その関数がC++アプリケーションでどのように定義されているかによって残る必要があります。
機能は、現在、このような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#アプリケーションを変更することができますか?ありがとう。
EDIT:追加情報
静的リンク([DllImport...]
)接続されているハードウェアをサポートしている別のDLLを実行時にロードされたシステムに接続されている依存しているハードウェアであるためオプションではありません。どちらのDLLも同じAPI呼び出しを持ちます。
これは –
全く違うDLL地獄ではありませんあなたはプロトタイプではexternを配置しようとしましたか? – bratao
それでは、 'ZBNConnect'をどのように初期化して、アンマネージ関数を指し示すのでしょうか?書かれているように、それは 'ヌル 'になるでしょう。なぜあなたはP/Invoke( '[DllImport] static extern')を使うのですか? –