从 C# 调用 C++ 代码而不创建 dll?

Posted

技术标签:

【中文标题】从 C# 调用 C++ 代码而不创建 dll?【英文标题】:Call C++ code from C# without creating dll? 【发布时间】:2014-01-10 09:30:53 【问题描述】:

我是 C# 的菜鸟,我已经在网上搜索过了。无论如何,我仍然不确定这一点,并且我无法完全控制我必须实现的代码,这就是为什么我想确保我不需要制作任何 dll。我有一个带有方法的 C++ 文件,我想从 C# 代码中调用这个方法。我只是在函数中添加了“extern C”。

当我只是将 .h 和 .cpp 文件添加到 C# 项目时,它们不会被检测到。当然,当我尝试将其添加为参考时,它不起作用。

那么我是不是一定要制作一个 dll 呢?

【问题讨论】:

为什么你不能制作一个程序集(dll)?有什么具体原因吗? 并非如此。但我更愿意确定没有其他办法 因为男女同校不属于我,所以我宁愿尽量少碰它 【参考方案1】:

从 C# 访问 C++ 代码的选项:

将 C++ 编译为非托管 DLL 并使用 p/invoke 进行访问。这需要使用 C 风格的 API 公开 C++ 代码。 将 C++ 编译为非托管 DLL 并使用 COM 访问。这要求您将 C++ 包装为 COM 对象。 将 C++ 编译为混合/模式 C++/CLI 程序集,并将程序集作为托管引用访问。这要求您将原始 C++ 包装为托管 C++ 引用类。

所有这些选项都必然涉及创建另一个模块/程序集。您不能将 C++ 代码直接链接到您的 C# 程序集中。

【讨论】:

可能值得澄清的是,第一个选项确实只在调用 C API 时有效,而第二个选项要求将 C++ 代码编写为 COM 对象 @jalf 我已经为所有选项的效果添加了文字【参考方案2】:

您可能想尝试使用PInvoke Interop Assistant 生成通过平台调用与 DLL 交互所需的 C#。请注意,这是不完美的,尽管如此 YMMV。

如果您有足够的知识和耐心,另一种选择是使用您的本机 C++ DLL 制作一个 COM 组件,然后使用类型库导入器从 C# 中使用该组件,以创建一个托管包装器。

【讨论】:

【参考方案3】:

您将无法与 .cpp/.h 文件交互,因为 C# 至少需要一个二进制对象(程序集)才能与之交互,而 C# 不会从 .cpp/.h 生成任何二进制文件。这是关于将这些文件添加为项目引用的主题。

至于您无法控制代码的论点 - 好吧,不要从实际的 .cpp/.h 中制作 DLL,而是制作您自己的瘦 DLL,其中包含仅包含的包装器对象标头,调用您将调用的任何方法,并链接到适当的 .o 文件或 .lib 或任何您拥有的文件。如果界面发生变化,您只需更改您的事物包装器,这应该很容易。

【讨论】:

以上是关于从 C# 调用 C++ 代码而不创建 dll?的主要内容,如果未能解决你的问题,请参考以下文章

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

从 C# 调用 C++ dll 方法/类

从 C# 中的 C++ 代码中获取对象功能

使用非托管 C++ .dll 从 C# .exe 调用函数

如何从 C++ 为 Xamarin.Android 创建 C# DLL

从 c# 调用 c++ 库