【问题标题】:Dynamically P/Invoking a DLL动态 P/Invoking DLL
【发布时间】:2020-07-31 19:54:53
【问题描述】:

从 .NET 动态 P/Invoke 非托管代码的最佳方法是什么?

例如,我有许多非托管 DLL,它们之间有通用的 C 样式导出。我想获取 DLL 的路径,然后根据导出的名称 P/Invoke 一个函数。直到运行时我才知道 DLL 名称。

基本上,对于 .NET,LoadLibraryGetProcAddress 的等价物是什么? (我现有的代码使用这些函数来完成相同的目标,完全在非托管代码中)。

【问题讨论】:

    标签: c# dynamic pinvoke


    【解决方案1】:

    本文描述了一个类型安全的 GetProcAddress 托管包装器,它应该可以帮助您。

    https://docs.microsoft.com/en-us/archive/blogs/jmstall/type-safe-managed-wrappers-for-kernel32getprocaddress

    【讨论】:

      【解决方案2】:

      您可以通过 P/Invoking 到 LoadLibrary 和 GetProcAddress 中执行此操作,然后使用 Marshal.GetDelegateForFunctionPointer

      详情请见this article

      【讨论】:

        【解决方案3】:

        另请参阅 Jonathan Swift 的 this 博客文章标题从 .net 动态调用非托管 dll

        【讨论】:

          【解决方案4】:

          您可以选择创建一个本机函数,该函数负责将适当的 DLL 和函数加载到内存中,然后根据您的路径将该函数返回到托管代码。这样您就可以自然地使用 GetProcAddress 技巧并返回函数点。然后,您可以 PInvoke 进入此函数并取回一个委托,然后该委托将调用到正确的 DLL。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-25
            • 2011-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多