C++ 如何导入用 C# 制作的 DLL?

Posted

技术标签:

【中文标题】C++ 如何导入用 C# 制作的 DLL?【英文标题】:How C++ can import a DLL made in C#? 【发布时间】:2009-07-10 17:10:20 【问题描述】:

我有一个用 C# 制作的 DLL,这个 DLL 包含一些像 Creator 这样的类。

我需要加载这个 DLL 并在 C++ 非托管中使用 Creator 类,

所以有什么方法可以创建该实例,还是我必须只加载公开的函数?

我需要这样的东西:


CreatorInstance->Init();

这可能吗?

【问题讨论】:

【参考方案1】:

您需要的大部分内容都可以在这里找到:http://msdn.microsoft.com/en-us/library/x0w2664k%28VS.80%29.aspx

首先,您需要了解用于 C++ 编译的 /clr 开关。然后,您需要了解 Microsoft 添加的允许混合程序集的 C++ 扩展。 (指向托管类的 C++“指针”将使用 p^ 而不是 p*,依此类推。)

【讨论】:

必须有一个 typelib-import 的方式来做到这一点,不是吗? 如果您正在处理 COM 对象,那么您可以使用类型库。正如 Reed Copsey 下面建议的那样,这是一种选择。您在下面的评论中指出您不能切换到 CLR,因为您“必须使用本机代码”。这些选项不是排他性的。 Microsoft 专门将 C++ 设计为当您需要让托管代码和非托管代码一起交流时使用的语言。【参考方案2】:

John Fisher 使用 C++/CLI 的方法是迄今为止处理此问题的最简单方法,但不是唯一方法。

其他三个选项是:

1) 使用 COM 互操作通过 COM 包装 .NET 类

2) 您可以在您的本机、非托管应用程序中托管 CLR,然后调用它。详情请见this article。

3) 您可以托管 Mono 运行时,并使用它来调用您的托管代码。详情请see this page。

选项 2 和 3 非常相似,但 IMO,3 比 2 更容易。

【讨论】:

谢谢。我不能切换到 cls,我必须使用本机代码。关于您的选择: 1-我已经将 DLL 作为 COM,但我想找到另一种方法来做到这一点。 2 和 3- 它们是如何工作的? 您的评论并不表明您是否清楚地理解了 clr 的建议。你不能打开 /CLR 开关?这太难了吗?如果打开 /clr,则将本机与托管混合。这不是一个完整的转换。 我的问题是客户要求,它不应该是 /CLR,它只是原生的。这不是我的选择。【参考方案3】:

这是一篇有趣的文章,介绍了如何在不使用 /CLR 选项的情况下完成此操作

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

效果很好。

【讨论】:

interop 很慢,但比 clr 好得多【参考方案4】:

首先,您不必“必须”使用 CLI 或 /clr 开关。使用良好的旧 COM 架构,您可以很容易地做到这一点http://msdn.microsoft.com/en-us/library/zsfww439.aspx。理解 COM 的工作方式可能是这里最大的挑战,但是一旦你知道它就会很有用。

【讨论】:

以上是关于C++ 如何导入用 C# 制作的 DLL?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ dll 连接到 C# 项目?

如何从 C# 导入和使用非托管 C++ 类?

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

C#导入c++ dll报找不到dll文件 masm32调用c++类库

在 C# 中从 C++ .DLL 加载值始终返回 true

C#编组来自C++ DLL的无符号字符返回值[重复]