今天公司让使用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;
}