编写用于 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的主要内容,如果未能解决你的问题,请参考以下文章