快捷搜索:

您的位置:澳门新葡4473网站 > 澳门新葡4473网站 > C#与C++混合编程

C#与C++混合编程

发布时间:2020-01-16 20:31编辑:澳门新葡4473网站浏览(148)

    1.打开vs2012-》新建项目-》其他项目类型-》Visual Studio解决方案-》空白解决方案-》修改名称,位置,解决方案名称(见名知义)

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

    2.步骤1中的解决方案-》右键单击-》添加-》新建项目-》win32控制台应用程序-》修改名称(见名知义)—》下一步,空项目-》确定

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

    3.源文件-》右键单击-》添加-》新建项-》c++文件(.cpp),修改名称-》确定

    实现步骤如下:

    4.现在可以在源文件中编写代码了

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

       1 using System;
       2 using System.Runtime.InteropServices;
       3 
       4 namespace Test
       5 {
       6     class Program
       7     {
       8         const string s = @"......DebugMyDll.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. 运行结果如图所示
      图片 7

    方案二:托管C++类库

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

    实现步骤如下:

    1. 鼠标右键单击解决方案,创建名为MyDepositDll的C++项目,其步骤与方案一中的前三步基本类似
    2. 鼠标右键单击该项目->添加->类,添加名为MyDepositDll的类,该类会自动产生两个文件,分别为MyDepositDll.h和MyDepositDll.cpp
      图片 8
    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. 此时,程序会报如下错误
      图片 9

    6. 鼠标右键单击项目->属性,在弹出的对话框中将其设置为“公共语言运行时支持”
      图片 10
    7. 鼠标右键单击该项目->生成,若成功则会输出如上面方案一中第五步相似结果
    8. 鼠标右键单击C#项目的引用->添加引用,选择项目->解决方案->MyDepositDll
      图片 11
    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. 运行结果如图所示
      图片 12

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

    图片 13

    本文由澳门新葡4473网站发布于澳门新葡4473网站,转载请注明出处:C#与C++混合编程

    关键词: