编写用于 C# 的非托管 C++ DLL

Posted

技术标签:

【中文标题】编写用于 C# 的非托管 C++ DLL【英文标题】:Writing unmanaged C++ DLLs for use in C# 【发布时间】:2012-04-28 10:10:47 【问题描述】:

我是一名 Linux C++ 开发人员,我需要为 windows 编写 C++ dll,用于 C# 应用程序。

问题是将 DLL 导入 C#,我不知道该怎么做。在我朋友的项目中,很可能会使用任何类型的非托管 dll,我负责这样做:-D

我需要导入 DLL 中的所有对象和函数,而我的搜索导致我只找到 DllImport 等等。

非常感谢您的帮助。

【问题讨论】:

C++/CLI Mixed Mode DLL Creation 的可能重复项 【参考方案1】:

您可以使用 C++/CLI 作为非托管 C++ 的包装器。有关 C++/CLI 及其功能的更多信息,您可以使用此链接

http://www.functionx.com/cppcli

你可以快速浏览一下

http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes#A8

【讨论】:

感谢您的链接。这是否意味着我必须修改我的 C++ 代码才能符合 CLI?我刚刚在启用了 clr 选项的 VC++ 中再次编译了我的 C++ 代码,我现在可以在 C# 中导入它,但我没有在对象浏览器中看到它的内容。怎么办? 通过dllexport导出你想在c#中使用的c++类,然后在你的C++/CLI项目中使用生成的lib文件作为外部依赖。将C++/CLI项目作为dll和为您的 C++ 代码编写包装类。在您的 C# 代码中使用此托管 dll 好吧,我在这里找到了我正在寻找的答案:msdn.microsoft.com/en-us/library/ms173265(v=vs.80).aspx,我可以简单地在类定义之前加上 public 并在 C# 中访问它,但 public不适用于在类之外的全局命名空间中定义的函数。我该怎么做? 是的新手,你是对的。正如我在这个问题之后的另一个问题中所问的那样,我找到了做到这一点的方法。还是谢谢。【参考方案2】:

你想要 DllImport

这里有很多信息:-

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

还有更多关于谷歌的内容,以及许多与 DllImport 相关的 *** 问题

【讨论】:

没错,但是 DllImport 不导入对象,如果 dll 包含具有大定义的对象,我该怎么办?很多成员函数等等? 那么您更好的选择是将您的 C++ 编译为 CLR 代码。但即便如此,您也必须做一些工作,因为并非所有 C++ 基本类型都能很好地与 .NET 接口。【参考方案3】:

有很多方法可以解决这个问题。您可以在 C++ 中编写一个 CLR dll,它放置一个 C# 可以直接“对话”的接口。这是一个不错的选择,因为您可以保持原生 C++ 不变,而不是让所有代码都基于 CLR。​​

搜索 C++/CLI

您也可以使用 dllimport 和朋友创建一个标准的 dll。

【讨论】:

【参考方案4】:

您是否想过将 Dll 保留在 C++ 中(端口然后在 VS.NET 下重新编译)比 C# 端口更省力。

我过去制作了一个共享内存 DLL 以允许 LabVIEW (Windows7) 和 Winforms C#.NET 应用程序。通过此 dll 共享数据存储。

【讨论】:

【参考方案5】:

看看这个教程。它显示了完成您想要的两种方法:How to Marshal a C++ Class

【讨论】:

以上是关于编写用于 C# 的非托管 C++ DLL的主要内容,如果未能解决你的问题,请参考以下文章

在 c++ 中为非托管 c# dll 使用 std::string

C#调用C++编写的DLL(非托管)

如何添加对由 C# 项目调用的非托管 C++ 项目的引用?

从 C# 调用非托管 C++ VS 6.0 MFC dll

在非托管 C++ DLL 和托管 C# UI 之间发送信息

从 C# 线程内的非托管 dll 运行函数