码迷,mamicode.com
首页 > 编程语言 > 详细

C#与C++混合编程

时间:2017-05-06 23:04:29      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:c++类   类库   总结   缺点   选项   运行   std   pre   需要   

方案一:非托管动态链接库

将本机C++代码编译成一个dll文件以供C#调用,调用方法为 [DllImport("×××.dll")] 。此方法只能调用其中的函数,不能调用类。其原因是因为本机C++是非托管的,与C#的语言不兼容。

实现步骤如下:

  1. 打开VS创建名为CSharpInvokeDll的解决方案和名为MyDll的C++项目
    技术分享
  2. 单击“确定”按钮后,在弹出的对话框中单击“下一步”按钮
    技术分享
  3. 然后选择应用程序和附加选项
    技术分享
  4. 鼠标右键单击项目->添加->新建项,分别添加名为MyDll.h和MyDll.cpp的头文件和源文件,编写代码如下
    技术分享
  5. 鼠标右键单击项目->生成,若成功则会有如下输出
    技术分享
  6. 鼠标右键单击解决方案->添加->新建项目,创建名为Test的C#控制台应用程序
    技术分享
  7. 鼠标右键单击该项目->设为启动项目,并修改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 }
  8. 运行结果如图所示
    技术分享

方案二:托管C++类库

利用.Net框架下的公共语句运行时(CLR)编写输出类库供C#调用。由于CLR的C++和C#都符合公共语言规范(CLS),所以两者可以无缝集成。尽管CLR的C++与传统的C++貌似十分相似,也都可以使用指针,但是两者还是有着很大的区别,甚至可以认为是另一种不同的语言。

实现步骤如下:

  1. 鼠标右键单击解决方案,创建名为MyDepositDll的C++项目,其步骤与方案一中的前三步基本类似
  2. 鼠标右键单击该项目->添加->类,添加名为MyDepositDll的类,该类会自动产生两个文件,分别为MyDepositDll.h和MyDepositDll.cpp
    技术分享
  3. 修改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 };
  4. 修改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 }
  5. 此时,程序会报如下错误
    技术分享
  6. 鼠标右键单击项目->属性,在弹出的对话框中将其设置为“公共语言运行时支持”
    技术分享
  7. 鼠标右键单击该项目->生成,若成功则会输出如上面方案一中第五步相似结果
  8. 鼠标右键单击C#项目的引用->添加引用,选择项目->解决方案->MyDepositDll
    技术分享
  9. 修改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 }
  10. 运行结果如图所示
    技术分享

总结:方案一实现起来更容易些,无论C还是C++编写的DLL都可以调用,可以实现关键代码的隐藏。缺点是C#端需要指针、new、delete等内存操作。

技术分享

C#与C++混合编程

标签:c++类   类库   总结   缺点   选项   运行   std   pre   需要   

原文地址:http://www.cnblogs.com/luckymonkey/p/6818249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!