C# 使用C++调用C#的DLL

简述

我们有时候需要在C++程序中去使用一些C#程序的代码,但是又不想弄的太麻烦,或者是我们想要使用别人写好的C#库,那么该怎么办呢?最方便的就是把C#编译成dll,然后用再在C++中去调用。

目录

一、C#项目生成DLL

(一)、新建项目生成dll

(二)、已有项目生成dll

二、调用C#的dll

(一)、在C#项目中调用C#的dll

(2)C++调用C#的dll——直接调用

(3)C++调用C#的dll——COM组件方式

 


一、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组件接口方式相同。

 

 

参考博客:

https://blog.csdn.net/tmylzq187/article/details/51783633

https://blog.csdn.net/shq886258963/article/details/59057797

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值