2

.NET アプリケーションがあり、ユーザーが場所を指定したネイティブ ライブラリをロードする必要があります。PInvoke は、グローバル検索パス (またはコンパイル時に指定されたパス?) からのみ読み込まれるように見えます。実行時に LoadLibrary を呼び出す C++/CLI アセンブリを作成するのが最善の方法でしょうか?

C++/CLI は C# PInvoking LoadLibrary よりも簡単ですか?

4

2 に答える 2

8

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 プロジェクトを追加するよりもはるかに高速になります。

于 2009-02-09T21:53:10.933 に答える
0

私は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() を使用して、返されたアドレスをデリゲートにバインドします。

于 2009-02-09T22:00:40.883 に答える