【问题标题】:Using C++ DLLs determined during runtime in C#在 C# 中使用在运行时确定的 C++ DLL
【发布时间】:2012-07-10 05:28:18
【问题描述】:

我目前正在做一个 C# 项目,我对 C# 的经验为零。

我们有一组用 C++ 编写的 DLL,它们具有相同的类和相同的功能,但它们的工作方式不同。例如,假设我们的程序转换 BMP 文件。我们有用于将 BMP 转换为 JPG、BMP 转换为 PNG 等的 DLL。

我们用 C# 编写的程序应该以某种方式包装这些 DLL,但不是以静态方式。我们希望能够在运行时更改正在使用的 DLL,并在需要时(也在运行时)添加新的 DLL。喜欢插件,如果你愿意的话。

您对实施这种方法有何建议?

【问题讨论】:

  • 这些 DLL 是否导出了任何 C++ 类,或者导出中只有 PInvoke 兼容的函数?
  • 从目前的代码中我可以看出,它们只是 PInvoke 兼容的函数。

标签: c# c++ dll wrapper


【解决方案1】:
【解决方案2】:

如果您事先不知道所有 DLL 是什么,您可能需要调用 Win32 函数“LoadLibrary”、“GetProcAddress”和“FreeLibrary”。据我所知,c# 没有办法自动执行某种动态 PInvoke。请参阅this blog post 了解更多信息

或者,您可以使用 PInvoke 为每个 DLL 创建一个 C# 包装器,然后使用托管委托来调用这些函数。然后,通过更改委托,您可以在运行时调用不同的函数(可能在不同的 DLL 中)。这取决于您是否拥有打算在编译时使用的 DLL 的完整列表。不过,它比第一个选项更强大。让运行时为您处理所有封送处理也容易上千倍。请参阅this MSDN article 了解更多信息。

【讨论】:

    【解决方案3】:

    如果它们已经在 C++ 中,我会选择用 C++ 编写托管程序集。
    这个walkthrough 可能是一个起点。尤其是 C++ 的人不需要学习 C#。
    P/Invoke 有点慢,但更深层次的问题是版本管理,因为 P/Invoke 会导致运行时异常,并且不会在以下情况下编译错误变化。

    【讨论】:

      【解决方案4】:

      你可以使用externDLLImport类似微软提供的设施,更多详情Go hereHere

      【讨论】:

        猜你喜欢
        • 2013-08-24
        • 1970-01-01
        • 2019-11-24
        • 2015-03-26
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多