如何在 Visual C++ 中制作 dll,我想用 C# 进行交互

Posted

技术标签:

【中文标题】如何在 Visual C++ 中制作 dll,我想用 C# 进行交互【英文标题】:How to make dll in visual c++ , i want to interact it with C# 【发布时间】:2013-11-02 19:41:11 【问题描述】:

我用 c++ 在visual studio 10 中编写了我的程序,但现在我想让它的dll 与可视 c# 的界面一起使用,我在我的程序中使用命令行参数进行输入

我看到here的教程,但是我的代码没有那里那么小,我有1000行,所以我不能这样写

static __declspec(dllexport) double Add(double a, double b);

对于每一行,我也在其中使用opencv 库,那么创建 c++ 程序的 dll 的另一种方法是什么,或者我怎样才能简单地将它与 c# 接口一起使用。

【问题讨论】:

您要导出的每个函数都必须标记为__declspec(dllexport)。将输出文件类型更改为 DLL。然后查看 P/Invoke 以从 C# 调用它。 @JonathonReinhart 我的库,如 opencv,我在程序中手动添加,自动传输到 dll,或者我需要在我的 c# 项目中重新配置它 只要 DLL 正确链接到 OpenCV(静态或动态),您的 C# 程序就不必了解它。 我有我的程序的 .exe 文件,它与 cmd 一起使用,我可以使用 .exe 而不是 dll ,用于相同的目的(仅用于接口,接口是仅用于输入和输出) 这只有在您使用 C++/CLI 编写代码或使用类型库创建 COM 组件时才容易。当然,使用 __declspec(dllexport) 并构建一个 DLL 是可行的,但它必须在 C# 程序中使用 pinvoke 调用。这需要在 C# 中编写 [DllImport] 声明,IDE 完全没有帮助。这仅适用于简单的 C 风格函数,不适用于 C++ 类。看看 C++/CLI 取得成功。 【参考方案1】:

两个程序可以通过多种方式进行交互。

即使使用__declspec (dllexport),也不要将其添加到程序的每一行。相反,您需要将其添加到“导出的函数”中。因此,您需要做的第一件事是创建要从 C++ 程序中导出的函数列表。如果您对您的界面外观提供一些更深入的了解,您可能会在此处获得更好的响应。

除了 DLL 之外,程序还可以通过其他方式进行交互。当没有其他可行的方法时,甚至文件 I/O 也是可能的,其中一个程序将文件写入文件作为输入,而另一个程序读取它。

【讨论】:

我的输入是属于opencv的MAT形式的图像,我的输出是文本文件的形式,我尝试了在界面上显示文本文件输出的方式,它可以工作,但是显示输入错误,但我想知道我是否也需要为 c# 配置 opencv,即使我有整个程序的 .exe 实际上我正在做的是在 c# 项目的引用中使用我的 c++ 代码 exe 文件并使用 process.start ,但它给我的 opencv 项目错误,但是当我运行与 cmd 相同的程序它可以工作,当我运行 c++ 的简单程序并将其 exe 包含在 c# 中时,它可以与 process.start 和 interface 一起工作

以上是关于如何在 Visual C++ 中制作 dll,我想用 C# 进行交互的主要内容,如果未能解决你的问题,请参考以下文章

如何制作不需要用户使用特定版本的 Visual Studio 的 C++ API?

Visual Studio 2015。在安装项目中转换为所有 dll 的 c++ 控制台应用程序

在 Qt 中构建 DLL 并在 Visual Studio+Del​​phi 中使用

如何在 Visual Studio C++ 的 dll 项目中包含一个库

Visual Lisp:如何调用外部 C++ DLL 中的函数

返回String类型时Visual Basic WPF加载ATL C++ dll程序退出