C++调用C#生成的DLL实现及注意事项
2014-01-08 14:48
1326 查看
本文将介绍C++中调用C#生成的DLL的方法以及注意事项。
首先建立C#的“类库”工程CShapeDLL。
然后输入如下代码:
这里有两个类,一个是MyAddClass类,是用来做加法运算的,另一个是CMyWriteLine,用来输出文本的。
然后以C++控制台程序为例,C++代码如下:
编译,出错。提示如下:
fatal error C1190: 托管目标代码需要“/clr”选项
好吧,修改下,在“属性”->“配置属性”->“常规”->“公共语言运行库支持”中选取“公共语言运行库支持(/clr)”。如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/f72fb86e3208198f3114773c8123c92c)
若是建立的MFC应用程序则设置时应注意
1.确保将“MFC 的使用”设置为“在共享
DLL 中使用 MFC”如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/b15353c856c300b8cf8192b223f01e63)
2.在“配置属性”下,展开“C/C++
”旁边的节点并选择“常规”。请确保将“调试信息格式”设置为“程序数据库 /Zi”(而不是“/ZI”)。如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/3748aea6e60b5f3ac32eae175c1eb8eb)
3.在“配置属性”下,选择“C/C++
”,然后选择“代码生成”。请确保将“运行时库”设置为“多线程调试 DLL (/MDd)”或“多线程 DLL (/MD)”之一。如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/b89425f2072c732189d0b18e09f4c493)
4.在项目属性“通用属性”下的“框架和引用”界面下点击左下角的添加应用
选择.Net下的System.Windows.Forms,如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/25eb4eede1e188e69321b54e13e61c19)
再编译,成功了。运行下,又出错了,如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/a1920e5d7a376cd0bc67dbadc0251d15)
这个怎么解决了,很简单,这是因为EXE程序没能加载到DLL文件导致的,将CShapeDLL.dll拷贝到EXE程序所在目录下,再运行,成功了。结果如下图所示(WinXP及Win7均可以运行):
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/11/b43a6affaba2855d2d1420077e2a276d)
在MFC下如果加载System.Windows.Forms项,会出现error
C3083: “Windows”:“::”左侧的符号必须是一种类型,而这一错误是由于使用公共语言运行时支持(clr)所导致的,所以在MFC应用程序调用C#Dll的过程中必须加载System.Windows.Forms项。
部分内容参考:/article/1392151.html
首先建立C#的“类库”工程CShapeDLL。
然后输入如下代码:
//C++通过DLL调用C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CShapeDLL { public class CMyAddClass { private int m_nNumber1; private int m_nNumber2; public int Number1 { set { m_nNumber1 = value; } get { return m_nNumber1; } } public int Number2 { set { m_nNumber2 = value; } get { return m_nNumber2; } } public int AddFunc() { return m_nNumber1 + m_nNumber2; } } public class CMyWriteLine { private string m_strText; public string Text { set { m_strText = value; } get { return Text; } } public void WriteLineFunc() { Console.WriteLine(m_strText); } } }
这里有两个类,一个是MyAddClass类,是用来做加法运算的,另一个是CMyWriteLine,用来输出文本的。
然后以C++控制台程序为例,C++代码如下:
//C++通过DLL调用C#代码 ///article/1392151.html #using "CShapeDLL\\CShapeDLL\\bin\\Debug\\CShapeDLL.dll" //#using "CShapeDLL\\CShapeDLL\\bin\\Release\\CShapeDLL.dll" #include <stdio.h> #include <conio.h> using namespace CShapeDLL; int main() { printf(" C++通过DLL调用C#代码\n"); CMyWriteLine ^ writeLineClass = gcnew CMyWriteLine; writeLineClass->Text = "使用C# 的CMyWriteLine示范"; writeLineClass->WriteLineFunc(); printf("\n ---------------------------------- \n"); CMyAddClass ^ addClass = gcnew CMyAddClass; addClass->Number1 = 3; addClass->Number2 = 5; printf("使用C# 的CMyAddClass示范\n"); printf("%d + %d = %d\n", addClass->Number1, addClass->Number2, addClass->AddFunc()); getch(); return 0; }
编译,出错。提示如下:
fatal error C1190: 托管目标代码需要“/clr”选项
好吧,修改下,在“属性”->“配置属性”->“常规”->“公共语言运行库支持”中选取“公共语言运行库支持(/clr)”。如下图所示
若是建立的MFC应用程序则设置时应注意
1.确保将“MFC 的使用”设置为“在共享
DLL 中使用 MFC”如下图所示
2.在“配置属性”下,展开“C/C++
”旁边的节点并选择“常规”。请确保将“调试信息格式”设置为“程序数据库 /Zi”(而不是“/ZI”)。如下图所示
3.在“配置属性”下,选择“C/C++
”,然后选择“代码生成”。请确保将“运行时库”设置为“多线程调试 DLL (/MDd)”或“多线程 DLL (/MD)”之一。如下图所示
4.在项目属性“通用属性”下的“框架和引用”界面下点击左下角的添加应用
选择.Net下的System.Windows.Forms,如下图所示
再编译,成功了。运行下,又出错了,如下图所示
这个怎么解决了,很简单,这是因为EXE程序没能加载到DLL文件导致的,将CShapeDLL.dll拷贝到EXE程序所在目录下,再运行,成功了。结果如下图所示(WinXP及Win7均可以运行):
在MFC下如果加载System.Windows.Forms项,会出现error
C3083: “Windows”:“::”左侧的符号必须是一种类型,而这一错误是由于使用公共语言运行时支持(clr)所导致的,所以在MFC应用程序调用C#Dll的过程中必须加载System.Windows.Forms项。
部分内容参考:/article/1392151.html
相关文章推荐
- C# 调用带有复杂参数的C++ ,delphi dll 注意事项备注。(C++ dll 怎么回调C# 程序,参数怎么写?)
- 字段内存C#调用C++DLL注意事项
- C#中调用C++写的DLL注意事项
- (学习笔记)C++编写dll C#调用注意事项
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- VS2012环境下C#调用C++生成的DLL
- C# 调用C++工程生成的DLL
- C#调用C++生成的dll,参数有结构体数组
- 关于C#中调用C++编写的DLL(非托管的DLL)的实现和问题记录
- C#调用C++生成的DLL(实例1)
- 在vs2010上c#调用c++ 生成的dll
- 在c#里调用C++的dll时,需要注意的一些问题
- c#程序调用c++编写dll需要注意问题
- 在C#里调用C++的dll时需要注意的一些问题<转>
- C#调用api,或C++生成的dll
- Qt Creator调用VS2008生成的DLL注意事项 good
- C++调用C#的DLL实现方法
- C# 调用 C++生成的Dll
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试