【问题标题】:Can .NET PInvoke dynamically load a native dll from a user specified directory?.NET PInvoke 可以从用户指定的目录动态加载本机 dll 吗?
【发布时间】:2009-02-09 21:45:33
【问题描述】:

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

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

【问题讨论】:

    标签: .net directory pinvoke native loadlibrary


    【解决方案1】:

    如果您已经有一个 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 项目快得多。

    【讨论】:

      【解决方案2】:

      我同意 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() 将返回的地址绑定到委托。

      【讨论】:

      • AFAIK,使用完整路径加载 DLL 后,TEST.DLL 的 P/invoke 声明应该可以正常工作。 c:\path\to\test.dll。只要确保 LoadLibrary 先发生即可。
      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多