标签:c++类 类库 总结 缺点 选项 运行 std pre 需要
方案一:非托管动态链接库
将本机C++代码编译成一个dll文件以供C#调用,调用方法为 [DllImport("×××.dll")] 。此方法只能调用其中的函数,不能调用类。其原因是因为本机C++是非托管的,与C#的语言不兼容。
实现步骤如下:
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++貌似十分相似,也都可以使用指针,但是两者还是有着很大的区别,甚至可以认为是另一种不同的语言。
实现步骤如下:
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 };
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 }
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++类 类库 总结 缺点 选项 运行 std pre 需要
原文地址:http://www.cnblogs.com/luckymonkey/p/6818249.html