您的位置:首页 > 编程语言 > C语言/C++

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

#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#中引用c++