.NET アプリケーションがあり、ユーザーが場所を指定したネイティブ ライブラリをロードする必要があります。PInvoke は、グローバル検索パス (またはコンパイル時に指定されたパス?) からのみ読み込まれるように見えます。実行時に LoadLibrary を呼び出す C++/CLI アセンブリを作成するのが最善の方法でしょうか?
C++/CLI は C# PInvoking LoadLibrary よりも簡単ですか?
.NET アプリケーションがあり、ユーザーが場所を指定したネイティブ ライブラリをロードする必要があります。PInvoke は、グローバル検索パス (またはコンパイル時に指定されたパス?) からのみ読み込まれるように見えます。実行時に LoadLibrary を呼び出す C++/CLI アセンブリを作成するのが最善の方法でしょうか?
C++/CLI は C# PInvoking LoadLibrary よりも簡単ですか?
C#/VB.Net プロジェクトが既にある場合は、DLL をロードするために PInvoke LoadLibrary を実行する方がはるかに簡単です。既存の dll から 1 回のクイック PInvoke 呼び出しが必要です。
public partial class NativeMethods {
/// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
///lpLibFileName: LPCWSTR->WCHAR*
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="LoadLibraryW")]
public static extern System.IntPtr LoadLibraryW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpLibFileName) ;
}
このコードを追加するだけで、完全な C++\CLI プロジェクトを追加するよりもはるかに高速になります。
私はJaredParに同意します。dll をロードしたら、関数ポインターを使用して dll によって公開された API にアクセスする必要があります。単純な PInvoke 宣言はもはや機能しません。Windows API GetProcAddress を使用する必要があります。
[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true)]
public static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);
...次に、System.Runtime.InteropServices 名前空間で GetDelegateForFunctionPointer() を使用して、返されたアドレスをデリゲートにバインドします。