一、环境说明
开发环境:vs2022、.NET Framework 4.6.1、ABB离线接口库、vs2013
开发语言:C#、C++
二、实现意义
官方提供的ABB离线接口开发库由C#语言编写,但在实际项目中需要被C++项目调用。所以首先生成C#动态库,然后使用C++项目引用该动态库。
三、操作流程
1.新建C# 类库(.NET Framework)项目
2.打开新建项目属性,修改目标平台与C++项目平台一致(Debug/Release)与(x64/x86) 注意!勾选“为COM互操作注册”
3.将测试有效的C#源码复制到新建项目.cs文件内,正常配置ABB官方库及第三方库(配置方式参考上一篇博客),以管理员身份运行VS2022下的该项目,点击生成解决方案即可生成DLL动态库文件,输出路径位于与目标平台对应的文件路径下。
4.打开C++项目(本文环境为VS2013),项目属性—>配置属性—>常规
公共语言运行时支持 选择 “公共语言运行时支持(/clr)”
5.将前文封装好的动态库文件与其引用的第三方库文件,一同复制并添加至C++项目引用中。
其中ABB_api_dll.dll、ABB_api_dll.pdb、ABB_api_dll.tlb为上文生成的动态库;RobotStudio.Services.RobApi.dll、RobotStudio.Services.RobApi.Desktop.dll、ABB.Robotics.Controllers.PC.dll、ABB.Robotics.Controllers.PC.xml为ABB官方提供接口库;ABB_dlltest为C++项目名。不要忘记在源码目录和运行目录下都要复制一遍。
6.C++项目引用C#库时需要注意的差异:
(1)动态库文件需要在引用文件中使用 #using 进行引入,不能使用 #include;不要忘记引入命名空间。
#using "ABB_api_dll.dll"
#using "ABB.Robotics.Controllers.PC.dll"
using namespace ABB_api_dll;
using namespace System;
(2)C# 库生成对象指针时用 ^,代替C++使用的 *;使用gcnew 代替C++使用的 new 生成对象
ABB_api ^api = gcnew ABB_api();
(3) C++与C#中的String类型是两种不同的数据类型,需要针对性转换。
四、部分代码示例
void ABB_dlltest::start()
{
std::cout << "程序启动" << std::endl;
// C++调用C#库时特殊的new方式
ABB_api ^api = gcnew ABB_api();
// 读取机器人控制系统名称
string NamePath = ".\\release\\SystemName.txt";
ifstream inFile(NamePath, ios::in | ios::binary);
if (!inFile) {
cout << "error" << endl;
}
char c[40];
inFile.getline(c, 40);
// C++与C#间不同String类型的转化
string strc = std::string(c);
inFile.close();
System::String^ systemName = gcnew String(strc.c_str());
// 调用离线功能接口
api->Api_Scan(systemName);
api->Api_MotorOn();
api->Api_PointerReset();
api->Api_StartAll();
Sleep(6000);
api->Api_StopAll();
api->Api_MotorOff();
std::cout << "运行完成,程序结束" << std::endl;
}