海安做网站的公司不良广告
C++调用C#方法
- 写在前面
 - 效果
 - 思路
 - 步骤
 - 可能的问题
 
- 写在后面
 
写在前面
工作需要用C++调用C#写到代码,看来网上写的方法,自己也踩了一些坑,这里总结一下,我只试了CLR的方法。
 主要参考了下面几篇博客
 C++调用C#库简单例程(Lucky的outlook应该使用了这个技术
 C++ 调用C#工程的 dll , 互相调用方法
 C++调用C#的库
效果
这里用C++调用C#类的加法函数实现2+3,然后调用C#的Console.WriteLine打印
 
思路
C#生成DLL文件,C++调用C#的DLL
步骤
1、创建C# .NET Framework类库
 注意是.NET Framework类库,不要创建错了
 
 我命名为CSAdd
 
 这里我们在CSAdd命名空间下写了一个Class1类。类中写两个函数,一个Add函数实现加法,一个Print函数调用Console.WriteLine。
 注意这个类在CSAdd命名空间下,所以后面的C++调用要先引用这个命名空间才能创建Class1类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSAdd
{public class Class1{public int Add(int a,int b){return a + b;}public void Print(String str){Console.WriteLine(str);}}
}
 
2、创建CPP项目
 创建控制台应用
 
 我命名为CPPInvokeCSAdd
 
 在高级中开启clr
 
 C/C++ —>语言---->符合模式设为否
 
 我们写个main函数直接运行
 
 可以看到exe文件确实生成在了\x64\Debug目录下
 
3、修改C#DLL的生成路径
在C#项目中把输出路径改为c++项目exe的输出路径上,也就是上面的\x64\Debug路径
 
生成DLL,可以看到我们的CSAdd.dll生成在了这个目录下。
 注意C#的DLL一定要和C++生成的exe在同一个目录下
 
4、编写C++程序,调用C#的DLL
 关键点:
 (1)使用#using 引用C#的dll,因为C#的dll放在C++项目下所以用../x64/Debug/CSAdd.dll代替完整路径F:\C++\CPPInvokeCSAdd\x64\Debug,写完整路径也可以。
 (2)使用using namespace引入dll中的命名空间CSAdd,这样才能调用Class1类
 同时我们还迎入了C#的System命名空间,这是因为我们要在C++中创建C#的String对象(在System命名空间下)作为Print函数的参数(因为Print函数是C#实现了,所以不支持C++的std::string)。
 (3)使用gcnew创建C#对象
 (4)用 类名^ 表示C#的对象,所以这里用Class1^ dll,而不是Class1 dll。在C++/CLI中这个^类似于C++中的指针,但是因为C#有虚拟机,所以Class1^ dll实际是虚拟机在管内存的分配与回收,而不想C++的指针那样new的东西需要自己回收。
 (5)因为dll->Print是调用C#中的方法,所以Print参数类型String也必须C#类型,所以创建了String^ resultStr。
 (6)为什么resultInt变量能调用ToString()方法?因为resultInt的类型是C#的int不是C++的int(我有点疑惑,具体得看看CLI的语法),所以直接dll->Print(resultInt.ToString())也是可以的。
//使用#using引用C# DLL,而不是#include;
#using "../x64/Debug/CSAdd.dll" 
// 引入CSAdd、System的命名空间
using namespace CSAdd;
using namespace System;int main()
{Class1^ dll = gcnew Class1();//使用gcnew创建dll中的对象指针int resultInt = dll->Add(2, 3);//调用dll对象中的方法String^ resultStr = gcnew String(resultInt.ToString());dll->Print(resultStr);return 0;
} 
运行
 
 5、如果之后要修改C#的代码
 因为前面设置了C#项目中DLL是直接生成在C++项目的目录下的,所以修改完C#代码后直接在C#项目中点击生成就行了,不用该C++代码。
 如果C++中#using "../x64/Debug/CSAdd.dll"这行编译器提示出错,把这行删了重写一次就好了。
可能的问题
报错:未能加载文件
 
 可能原因:C++生成的exe和C#生成的dll不在同一个目录下,一定要在同一个目录下
 
 解决办法:
 C++项目的常规->输出目录、链接器->输出文件、c#的dll生成目录都是同一目录
 
 
 
写在后面
初入职场,上班好累啊,呜呜呜。
 
