最近、vc の dll を使用するプロジェクトに取り組みましたが、.net で呼び出す必要がありました。C# でアンマネージ dll を呼び出す方法を勉強しました。
まずはdllファイルを紹介しましょう
1.Dllファイル
ダイナミック リンク ライブラリ (DLL とも呼ばれ、「ダイナミック リンク ライブラリ」の略) は、Microsoft Windows の最も重要なコンポーネントの 1 つです。Windows のシステム フォルダを開くと、そのフォルダ内に多数の DLL ファイルがあることがわかります。主要なシステム機能は DLL モジュールの形式で実装されます。
ダイナミック リンク ライブラリは、直接実行することも、メッセージを受信することもできません。これは、特定の操作を完了するためにプログラムまたは他の DLL によって呼び出される関数 (メソッド) を含む単なる独立したファイルです。 ) ですが、これらの関数は実行プログラム自体の一部ではなく、プロセスのニーズに応じてオンデマンドでロードされ、現時点でのみ役割を果たすことができます。
DLL は、アプリケーションが必要とする場合にのみシステムによってプロセスの仮想空間にロードされ、呼び出しプロセスの一部になります。このとき、DLL にはプロセスのスレッドのみがアクセスでき、そのハンドルはアクセスできます。呼び出しプロセスによって使用され、呼び出しプロセスによって使用されます。プロセス ハンドルは、DLL でも使用できます。 DLL はメモリ内にインスタンスを 1 つだけ持ち、その準備は特定のプログラミング言語やコンパイラとは無関係であるため、DLL を通じて混合言語プログラミングを実現できます。 DLL 関数内のコードによって作成されたオブジェクト (変数を含む) は、それを呼び出すスレッドまたはプロセスによって所有されます。
2. DLLの呼び出し
DLL の呼び出し方法はプログラミング言語ごとに異なります。ここでは C# を使用した DLL の呼び出し方法のみを紹介します。まず、何が管理されており、何が管理されていないのかを理解する必要があります。一般的に、アンマネージ コードは主に win 32 プラットフォームに基づいて開発された DLL および activeX コンポーネントであり、マネージ コードは .net プラットフォームに基づいて開発されていると考えることができます。
(1) DLL内でアンマネージ関数を呼び出す一般的な方法
まず、外部メソッドは C# 言語ソース プログラムで宣言する必要があります。その基本形式は次のとおりです。
[DLLImport("DLL ファイル")]
修飾子 extern は変数型メソッド名 (パラメータリスト) を返します。
で:
DLL ファイル: 外部メソッドを定義するライブラリ ファイルが含まれます。
修飾子: アクセス修飾子、メソッドを宣言するときに使用できる抽象以外の修飾子。
戻り変数のタイプ: DLL ファイル内で呼び出す必要があるメソッドの戻り変数のタイプ。
メソッド名: DLL ファイル内で呼び出す必要があるメソッドの名前。
パラメータ リスト: DLL ファイル内で呼び出す必要があるメソッドのリスト。
注: System.Runtime.InteropServices 名前空間はプログラム宣言で使用する必要があります。
DllImport はメソッド宣言にのみ配置できます。
DLL ファイルは、プログラムの現在のディレクトリ、またはシステムによって定義されたクエリ パス (つまり、システム環境変数の Path によって設定されたパス) に配置されている必要があります。
戻り変数の型、メソッド名、およびパラメーターのリストは、DLL ファイル内の定義と一致している必要があります。
他の関数名を使用する場合は、次のような EntryPoint プロパティ設定を使用できます。
[DllImport("user32.dll", EntryPoint="メッセージボックスA")]
static extern int MsgBox(int hWnd, string msg, string caption, int 型);
その他のオプションの DllImportAttribute 属性:
CharSet は、次のように、エントリ ポイントで使用される文字セットを示します。
SetLastError は、SetLastError=true; のように、メソッドが Win32 の「最後のエラー」を保持するかどうかを示します。
ExactSpelling は、EntryPoint が、指定されたエントリ ポイントのスペルと正確に一致する必要があるかどうかを示します。例: ExactSpelling=false;
PreserveSig は、次のように、メソッドの署名を保存するか変換するかを示します。
CallingConvention は、次のようなエントリ ポイントの呼び出し規則を示します。