【问题标题】:Creating a DLL that can be used by native and managed applications创建可由本机和托管应用程序使用的 DLL
【发布时间】:2013-11-29 07:16:27
【问题描述】:

即使搜索了一段时间,我也找不到明确的答案。这似乎是一个不常见的问题:

我有一个应该放在 DLL 中的本机实现。该 DLL 应该可供本机应用程序和托管应用程序使用。

所以如果我用 C++/CLI 编写这个 DLL,我可以公开两件事:

  1. 一个扁平的、C 风格的导出函数接口,可由本机应用程序使用。
  2. 可通过引用此 DLL 从任何托管应用程序(例如 C#)中使用的托管类

这行得通吗?纯本机应用程序是否能够加载此 DLL 并调用公开的函数?

【问题讨论】:

  • 是的,这就是 C++/CLI 存在的原因之一——它一点也不“不常见”,我们一直都在这样做。 MSDN is very clear on the subject
  • COM组件可以从本机代码和托管代码中调用;这是另一种选择。
  • 事实证明这似乎行不通。我必须使用 /MT 开关编译我的 DLL(可能是因为我正在链接的某个库?)。但是我不能用 /clr 编译(/MT 和 /clr 不能一起工作,链接器说)......啊!
  • 使用简单的分层技术。首先编写本机代码,以便它可以直接从非托管代码中使用。在它上面添加一个 C++/CLI 层,它使用本机代码,因此它可以从托管代码中使用。使用来自本机代码的纯托管代码是可能的,只是更难做到正确。你必须了解 COM。

标签: c# c++ c++-cli native managed


【解决方案1】:

本机 DLL 像常规本机 DLL 一样编译(无 /clr)。 调用 C++/CLI 应用程序/DLL 使用 C++ 类通过 LoadLibrary 和 GetProcAdress 加载 DLL。 您需要让上述 C++ 类映射本机 DLL 的所有功能。 C++ 类充当代理类:

例子:

Native DLL 有一个函数foo()

C++/CLI 代码公开了一个方法 foo,如下所示:

void MyProxy::foo() {
    m_foo(); // m_foo is a function pointer to foo() in the DLL obtained via GetProcAddress.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2015-02-15
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多