博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 使用C++调用C#的DLL
阅读量:636 次
发布时间:2019-03-14

本文共 2542 字,大约阅读时间需要 8 分钟。

简述

我们有时候需要在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 
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组件接口方式相同。

 

 

参考博客:

转载地址:http://reulz.baihongyu.com/

你可能感兴趣的文章