最近在工作中的一个项目,需要使用C#编写的SDK, 而我们项目的代码是C++,如何利用C++调用C#SDK便成了一个问题。经过一番谷歌百度,最终采用CLR实现了C++对C#的调用。具体过程如下图所示
假设在C#项目中我们现在有一个API “PrintNameToScreen()”, 我们通过例子一步一步来看如何具体实现。
Step 1. 使用C# 生成dll., 项目名称叫做“DemoHelperLib”;
a. 打开VS2015, 选择Visual C# 的’ClassLibray’选项
b.项目生成后,配置项目属性, 其中 “Platform target”选择‘x64’, 而Outputpath 则是生成dll的文件夹,最终的大型项目一般要配置到主项目的exe路径下,这个后面会说到。
c.修改代码内容,VS默认生成的文件名和类名是class1, 为了使用方便,把类名改成DemoHelper,
并添加以下内容
void PrintNameToScreen(string sName)
{
Console.Write("Hello" + sName);
}
编译,在项目路径下的bin文,可以发现’DemoHelperLib.dll’已经生成,step1 到这里就大工告成啦。
Step2.建立C++ CLR 工程,生成library
a. 用VS2015新建一个visaul C++ CLR class library项目,如下图所示,项目名叫“DemoHelpCLRLib”
b. 打开项目设置,设置‘Use MFC in shared DLL ’
c. 在生成的“DemoHelpCLRLib.h” 头文件中,引入刚才生成的“DemoHelper.dll“的路径,还记得在step1中说的dll生成路径吗? 你可以把该路径直接配置成CLR项目的生成路径,对应本例是“D:\MoFei\Demo\DemoHelpCLRLib\x64\Debug”, 或者手动从bin folder下拷过来,不过不建议这样做,不然每次C#项目有更新,都要重新拷贝一遍,很麻烦的。直接设置好生成路径即可。
在头文件引入
#using "..\x64\Debug\DemoHelpLib.dll"
头文件添加如下代码, 设计一个类‘DemoHelperCLRModule’用来作为管理类,通过gcroot托管对象以实现调用C# API的效果。
// DemoHelpCLRLib.h
#pragma once
#include <afx.h>
#using "..\x64\Debug\DemoHelpLib.dll"
using namespace System;
using namespace System;
using namespace System::Windows;
using namespace System::