使用c++包装c#

今天公司让使用c++包装c#,提供c++的接口给客户使用,现在记录一下实现过程。

关键词:c++/cli,com模块,注册

首先需要搭建环境,我们需要一个带有c++和c#包的Visual Studio 。我直接在官网下载了社区版本。

在搭建好环境后,开始写代码。
先从c#开始,实现一个c#的dll文件。
初次接触这里有一些关键词:
1:GUID。在我的理解中这玩意更像是一个从c++指向c#的路标。在c#中生成GUID,详情查看这位大佬的博客就可以在c++中通过这个GUID来引用c#的代码。按照道理来说c#是无法和c++一起使用的,那为什么c++引用c#不会报错呢?
2:c++/cli。这个玩意是使c++和c#能一起使用的关键。可以按照下面的方法设置:在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对你的vs进行如上改动便可。
3:注册。关于注册我上面说的那个博客已经非常清楚了,这里不再赘述。

上面说的是一些硬性的条件。除了这些之外还有一些值得注意的是:
dll文件的存放位置以及需要的文件。
c#生成的dll文件包括 dll和tlb文件,这两个文件都需要放到相应的位置去。
所谓相应的位置指的是:当你没有在文件中声明路径时如 QLibrary mylib(“MPOSTDll.dll”);这样的写法,来直接引用dll文件,那么你的dll文件应该和你的cpp文件放在一起。

意外:事实上当我编好c++接口后,我开始的时候的确是将dll文件放在cpp所在的文件夹中了,并且当时经过测试,实际上的确是引用的这里的文件,但是这个时候我是无法用c++去引用c#中的方法的。但是当我按照上面的博主的文章注册完成后,我却必须在debug文件中放入dll文件才能被引用。不是很清楚原因,希望有知道的大佬指点一下。我的邮箱3079369786@qq.com。

ps:在使用的时候tlb文件必须不能忘记。

字符转换

在实现通过c++引用c#的功能后。在实际的使用上却出现了另一个问题。当我咋c#的方法中返回一个string类型时,却不可以在c++中接收,即使接收了也会出现乱码的情况。这实际上是因为c#的string和c++的string不是一种类型。c#中的string是System::string而c++中则是std::string这两种类型不能直接进行转化需要通过其他的方式。

转换方式一:
将string转换为BSTR类型,再通过_com_util::ConvertBSTRToString()方法转换为char*类型。示例代码如下

public char* MPOSTState()
{
	BSTR s = CalcPtr->GetState();//通过该方法(这个方法是我自定义的方法,为了举例,实际应用中替换为自己的方法即可)获取到相应的System::string字符串
	char* chars = _com_util::ConvertBSTRToString(s);
	return chars;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值