C#调用C++的程序
2016-05-15 22:23
483 查看
这两天公司给了一个新项目,要为USB以太网服务器(BT-3000GB)写一个切换程序,其实它本身是带了一个虚拟软件,但是不能满足公司的需求,所以要重新自己开发一款。于是参照着源码来进行开发,无奈源码是c++开发的,对我来说,有些晦涩难懂,于是乎,想出来一个方式,就是用c#补充为满足的要求,其他的功能还是保留c++的,在c#中调用c++的动态dll,开发中面临着很多问题,接下来会与大家分享。
1.在一个解决方案中创建两个项目,一个winform项目(这个和平常创建一样),一个c++项目(这个要注意,如下图)
这里要选择dll
建完如下所示:
2.c++项目生成dll需要注意的地方:
项目属性的设置,配置类型为dll,公共语言运行时支持选择/clr(公共语言运行时支持),否则在winform项目中无法使用。
3.c++中要调用的方法,c#如何引用
对于c++生成的dll的使用,我们需要对方法进行修饰,例如我要在c#中调用OnClickDevice方法,下面是c++和c#中各自的配置:
c++中首先声明EXPORT_DLL,然后用来修饰方法,这样才能保证方法在其他程序中能被调用,具体原因参考博客:http://blog.csdn.net/xfz0330/article/details/51348548
在c#这样引用,这并不像普通的在项目引用中添加dll就好了,而是要在代码中用DllImport来引用dll。
ok,这样我们就能调用c++的dll了,赶紧试一试吧。
1.在一个解决方案中创建两个项目,一个winform项目(这个和平常创建一样),一个c++项目(这个要注意,如下图)
这里要选择dll
建完如下所示:
2.c++项目生成dll需要注意的地方:
项目属性的设置,配置类型为dll,公共语言运行时支持选择/clr(公共语言运行时支持),否则在winform项目中无法使用。
3.c++中要调用的方法,c#如何引用
对于c++生成的dll的使用,我们需要对方法进行修饰,例如我要在c#中调用OnClickDevice方法,下面是c++和c#中各自的配置:
c++中首先声明EXPORT_DLL,然后用来修饰方法,这样才能保证方法在其他程序中能被调用,具体原因参考博客:http://blog.csdn.net/xfz0330/article/details/51348548
#define EXPORT_DLL extern "C" __declspec(dllexport)
EXPORT_DLL DWORD OnClickDevice(int idex)
{
SXUSBDEVICE sxdev[MAX_DEVICE];
DWORD i=0, j, dwReaded, dwReturned, dwIp;
TCHAR szBuf[4096], szIp[64],szPortName[256];
ZeroMemory(gsxdev, (sizeof(SXUSBDEVINFO) * MAX_DEVICE));
ZeroMemory(sxdev, sizeof(sxdev));
dwIp = gsxsrv[idex].dwIp;
if (!SxuptpEnumDevices(dwIp, &sxdev,
(sizeof(SXUSBDEVICE) * MAX_DEVICE), &dwReaded, &dwReturned))
{
return (FALSE);
}
fstream outfile("port.txt");
/*if(!outfile1){
cout<<"file open failed.\n";
return 0;
}*/
outfile.clear();
for (i = 0, j = 0; i < dwReturned; i++)
{
lstrcpy(gsxdev[j].szDeviceName, sxdev[i].szDeviceName);
lstrcpy(gsxdev[j].szLocation, sxdev[i].szLocation);
lstrcpy(gsxdev[j].szPortName, sxdev[i].szPortName);
gsxdev[j].dwIpPc = sxdev[i].dwIpPc;
gsxdev[j].wPid = sxdev[i].wPid;
gsxdev[j].wVid = sxdev[i].wVid;
gsxdev[j].wStatus = sxdev[i].wStatus;
gsxdev[j].wClass = sxdev[i].wClass;
if (!CollectMfpInterface(&gsxdev[j], gsxdev, j)) j++;
}
for (i = 0; i < j; i++)
{
wsprintf(szBuf, "%s (VID:%04X PID:%04X / %s)",
gsxdev[i].szDeviceName, gsxdev[i].wVid, gsxdev[i].wPid, gsxdev[i].szLocation);
outfile<<gsxdev[i].szLocation;
outfile<<'\n';
}
outfile.close();
return dwReturned;
}
在c#这样引用,这并不像普通的在项目引用中添加dll就好了,而是要在代码中用DllImport来引用dll。
[DllImport("Sample.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int OnClickDevice(int idex);
public int Link(int idex)
{
int devNum = OnClickDevice(idex);
}
ok,这样我们就能调用c++的dll了,赶紧试一试吧。
相关文章推荐
- 关于C++11中sequenced-before的讨论
- C++枚举类型的思考
- c语言 空数组 用法
- C++标准转换运算符reinterpret_cas…
- C语言位域 冒号
- C++多重继承中重写不同基类中相同…
- 位字段-C语言
- c/c++的预处理
- debian6.0 VIM 编写C++代码配置
- 结构体数组应用,C++课本P209页例题7.2,投票选举情况
- C语言的那些秘密之---函数返回局部…
- 如何在C语言中巧用正则表达式
- mysql connector c++ {realStr=<读取字符串的字符时出错。> }
- c/c++栈与队的数组实现方法
- C++静态成员变量和静态成员函数使用总结
- c++ primer(第五版)学习笔记及习题答案代码版(第八章)IO库
- PAT (Basic Level) Practise (中文)1049. 数列的片段和(20)
- C/C++的#error
- C++——构造函数的不同调用情况
- 经典算法<一>迷宫问题 3.多条路径 BFS求解 C++实现