本文共 2542 字,大约阅读时间需要 8 分钟。
我们有时候需要在C++程序中去使用一些C#程序的代码,但是又不想弄的太麻烦,或者是我们想要使用别人写好的C#库,那么该怎么办呢?最方便的就是把C#编译成dll,然后用再在C++中去调用。
目录
1. 在Visual Studio中新建类库项目,点击【文件】→【新建】→【Visual C#】→【类库】:
2. 编写自己需要的方法,这里我写了个非常简单的函数,返回两个数的和:
3. 生成dll,右键单击解决方案中的名称→【生成】,就会在刚才创建的项目路径下的bin目录下的Debug文件夹中生成了该类库的dll文件。然后我们就可以将这个dll文件拷贝到其他项目中供其他项目引用,调用其中相应的方法了:
对于不是新建的窗体应用、控制台应用项目,同样可以生成dll:
右键单击解决方案中的名称→【属性】,然后在输出类型中选择类库,选择后同样右键单击解决方案中的名称→【生成】,就可以得到该项目的dll文件
在一个窗体应用程序中右键单击引用→【添加引用】→【浏览】→选择刚才生成的dll的路径,点击确定,就把dll导入到项目中了。
之后新建一个按钮组件,双击编写代码,使用"using + dll中同样的命名空间"来引用这个dll,使用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方式
这种调用方式就是将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"#includeint _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组件接口方式相同。
参考博客:
转载地址:http://reulz.baihongyu.com/