0

c# 2010 で最も古い .dll ドライバー (.dll は .net ではない) を使用する必要があります。initdriver、closedriver、readdata 広告などを示す .dll に関する簡単なドキュメントがあります。

たとえば、INITDRIVER:

UNITE_RC rc = InitDriver(USHORT usNB_drv);
Parameters: usNB_drv: number or istance of driver that will be open
Return information:
OK:  well done
EBORNES: usNB_drv must be 1 or 2
EDRVAOPEN: driver yet open

だから私はWeb上で解決策を見つけようとしていますが、参照またはCOM +を使用して自分のプロジェクトでdllをリンクできないため、DLLImportを使用する必要があると思います。誰かがサンプルで私を助けることができますか? 本当にありがとうございました

4

1 に答える 1

2

UNITE_RCさて、 が何に展開されるかはわかりません。まで展開するとしintます。その場合、p/invoke 宣言は次のようになります。

[DllImport(@"MyLib.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int InitDriver(ushort usNB_drv);

cdeclまた、あなたが提示したコードは別の方法で述べていないため、呼び出し規約は次のとおりであると想定しています。もちろん、実際のコード (おそらくUNITE_RCマクロ内、あるいは別の場所) で、別の呼び出し規則が指定されていることも考えられます。この問題を解決するには、ライブラリで提供される C++ ヘッダー ファイルを使用する必要があります。

この問題を解決する別の方法は、混合モードの C++/CLI ラッパーをライブラリに使用することです。これにより、ヘッダー ファイルをインクルードし、リンカーにインポート ライブラリ (.lib) を提供する標準 C++ メカニズムによって、ネイティブ コードを呼び出してリンクすることができます。次に、C# コードで使用するマネージド クラス (C++/CLI の ref クラス) をエクスポートできます。ネイティブ コードに、呼び出す必要のある関数が多数含まれている場合、これが C# コードに公開する最もエラーが発生しにくい方法です。

于 2013-10-10T16:25:43.500 に答える