2

我有一个 .NET 应用程序,需要加载一个本地库,其位置由用户指定。PInvoke 看起来只会从全局搜索路径(或编译时指定的路径?)加载。最好的方法是创建一个在运行时调用 LoadLibrary 的 C++/CLI 程序集吗?

C++/CLI 会比 C# PInvoking LoadLibrary 更简单吗?

4

2 回答 2

8

如果您已经有一个 C#/VB.Net 项目,那么只需 PInvoke LoadLibrary 就可以更简单地加载 DLL。从现有的 dll 中快速调用 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 回答