简述
我们有时候需要在C++程序中去使用一些C#程序的代码,但是又不想弄的太麻烦,或者是我们想要使用别人写好的C#库,那么该怎么办呢?最方便的就是把C#编译成dll,然后用再在C++中去调用。
目录
一、C#项目生成DLL
(一)、新建项目生成dll
1. 在Visual Studio中新建类库项目,点击【文件】→【新建】→【Visual C#】→【类库】:
2. 编写自己需要的方法,这里我写了个非常简单的函数,返回两个数的和:
3. 生成dll,右键单击解决方案中的名称→【生成】,就会在刚才创建的项目路径下的bin目录下的Debug文件夹中生成了该类库的dll文件。然后我们就可以将这个dll文件拷贝到其他项目中供其他项目引用,调用其中相应的方法了:
(二)、已有项目生成dll
对于不是新建的窗体应用、控制台应用项目,同样可以生成dll:
右键单击解决方案中的名称→【属性】,然后在输出类型中选择类库,选择后同样右键单击解决方案中的名称→【生成】,就可以得到该项目的dll文件
二、调用C#的dll
(一)、在C#项目中调用C#的dll
在一个窗体应用程序中右键单击引用→【添加引用】→【浏览】→选择刚才生成的dll的路径,点击确定,就把dll导入到项目中了。
之后新建一个按钮组件,双击编写代码,使用"using + dll中同样的命名空间"来引用这个dll,使用dll中的方法就先创建对象,然后用对象调用该方法。
(2)C++调用C#的dll——直接调用
该方法需要设置公共语言运行支持属性,否则无法识别,选择项目→属性→配置属性→常规→公共语言运行时支持→公共语言运行时支持(/clr):
#using "F:/winform/Test/Debug/ClassLibrary1.dll" //引用dll,可以使用绝对路径,也可以换成相对路径
using namespace ClassLibrary1; //使用dll的命名空间
#include "stdafx.h"
#using "F:/winform/Test/Debug/ClassLibrary1.dll"
using namespace ClassLibrary1;
int main()
{
int sum, x, y;
x = 10;
y = 22;
Class1 ^a = gcnew Class1();
sum = a->Addition(x, y);
printf("计算结果:%d", sum);
return 0;
}
注意:
-使用#using引用C# DLL,不是#include
-dll需要和应用程序在一个同一个目录下,如果不在,运行会报错
-using namespace XXX // C#DLL的命名空间
-代码编译选项需要更改,请选择项目→属性→配置属性→常规→公共语言运行时支持→公共语言运行时支持(/clr)
-对象生成使用gcnew而不是new
-声明对象时用的是^(异或符号),而不是*(星号)
这是VC++托管代码中调用.net DLL的方法,如果是原生C++代码,不能这么调用,要用COM方式
(3)C++调用C#的dll——COM组件方式
这种调用方式就是将dll转换成类com组件的方式调用。C++ 调用C#的dll不是直接调用dll, 而是调用一个转变后的文件:.tlb文件。tlb文件是com类型库文件,它包含接口相关信息。在需要使用对应com类的模块里,通过"#import xxx.tlb"来调用。
这个.tlb文件会对应的生成tgpdfsignlib.tli 和 tgpdfsignlib.tlh两个文件。tlh、tli文件是vc++编译器解析tlb文件生成的标准c++文件。因为tlb并不是C++标准的东西,有必要把它们翻译成标准的C++类型,使得C++开发者可以使用。tlh相当于类型申明(头文件),tli相当于定义实现(CPP文件)。
C#代码:
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace MyCom
{
[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
public interface MyCom_Interface
{
int Add(int a, int b);
}
[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58")]
public class Class1 : MyCom_Interface
{
public int Add(int a, int b)
{
return a + b;
}
}
}
注意:
生成解决方案前,要在项目属性→应用程序→程序集信息→选中“使程序集COM可见”。
项目属性→生成→选中“为COM互操作注册”
设置完后再生成解决方案,就会在MyCom\bin\Debug目录下找到MyCom.dll和MyCom.tlb文件了。如果出现无法注册程序集的错误,就以管理员身份启动Visual Stdio就可以了。
#include "stdafx.h"
#import "..\\MyCom\bin\Debug\\MyCom.tlb"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
// COM初始化
CoInitialize(NULL);
MyCom::MyCom_InterfacePtr p(__uuidof(MyCom::Class1));
int a = p->Add(4,5);
return 0;
}
注意:
-C++使用COM组件时候不需要DLL文件,因为在COM组件生成的时候已经加入系统中去了,使用时候只需要tlb文件,记住是#import
-其他的就和调用普通COM组件接口方式相同。
参考博客: