首页 > 代码库 > C#与C++混合编程
C#与C++混合编程
方案一:非托管动态链接库
将本机C++代码编译成一个dll文件以供C#调用,调用方法为 [DllImport("×××.dll")] 。此方法只能调用其中的函数,不能调用类。其原因是因为本机C++是非托管的,与C#的语言不兼容。
实现步骤如下:
- 打开VS创建名为CSharpInvokeDll的解决方案和名为MyDll的C++项目
- 单击“确定”按钮后,在弹出的对话框中单击“下一步”按钮
- 然后选择应用程序和附加选项
- 鼠标右键单击项目->添加->新建项,分别添加名为MyDll.h和MyDll.cpp的头文件和源文件,编写代码如下
- 鼠标右键单击项目->生成,若成功则会有如下输出
- 鼠标右键单击解决方案->添加->新建项目,创建名为Test的C#控制台应用程序
- 鼠标右键单击该项目->设为启动项目,并修改Program.cs文件,编写代码如下
1 using System; 2 using System.Runtime.InteropServices; 3 4 namespace Test 5 { 6 class Program 7 { 8 const string s = @"..\..\..\Debug\MyDll.dll"; 9 [DllImport(s, EntryPoint = "MyFunction", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] 10 extern static int MyFunction(int a, int b); 11 12 static void Main(string[] args) 13 { 14 Console.WriteLine(MyFunction(3, 4)); 15 Console.Read(); 16 } 17 } 18 }
- 运行结果如图所示
方案二:托管C++类库
利用.Net框架下的公共语句运行时(CLR)编写输出类库供C#调用。由于CLR的C++和C#都符合公共语言规范(CLS),所以两者可以无缝集成。尽管CLR的C++与传统的C++貌似十分相似,也都可以使用指针,但是两者还是有着很大的区别,甚至可以认为是另一种不同的语言。
实现步骤如下:
- 鼠标右键单击解决方案,创建名为MyDepositDll的C++项目,其步骤与方案一中的前三步基本类似
- 鼠标右键单击该项目->添加->类,添加名为MyDepositDll的类,该类会自动产生两个文件,分别为MyDepositDll.h和MyDepositDll.cpp
- 修改MyKit.h文件,编写并修改代码如下
1 #pragma once 2 #include <string> 3 4 public ref class MyKit 5 { 6 public: 7 MyKit(); 8 ~MyKit(); 9 10 int MyFunction1(int a, int b); 11 System::String^ MyFunction2(System::String^ str); 12 };
- 修改MyKit.cpp文件,编写并修改代码如下
1 #include "MyKit.h" 2 3 MyKit::MyKit() 4 { 5 } 6 7 MyKit::~MyKit() 8 { 9 } 10 11 int MyKit::MyFunction1(int a, int b) 12 { 13 return a + b; 14 } 15 16 System::String^ MyKit::MyFunction2(System::String^ str) 17 { 18 return str; 19 }
- 此时,程序会报如下错误
- 鼠标右键单击项目->属性,在弹出的对话框中将其设置为“公共语言运行时支持”
- 鼠标右键单击该项目->生成,若成功则会输出如上面方案一中第五步相似结果
- 鼠标右键单击C#项目的引用->添加引用,选择项目->解决方案->MyDepositDll
- 修改C#项目中Program.cs文件,代码如下
1 using System; 2 3 namespace Test 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 MyKit kit = new MyKit(); 10 Console.WriteLine(kit.MyFunction1(3, 4)); 11 Console.WriteLine(kit.MyFunction2("Hello C++")); 12 Console.Read(); 13 } 14 } 15 }
- 运行结果如图所示
总结:方案一实现起来更容易些,无论C还是C++编写的DLL都可以调用,可以实现关键代码的隐藏。缺点是C#端需要指针、new、delete等内存操作。
C#与C++混合编程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。