原文链接地址:http://mp.weixin.qq.com/s/fI6KFArScIXG0Yy0akL7tg
Visual Studio 2017混合代码调试
1 引言
我们在做项目的时候,经常会遇到采用不同的语言编写不同的部分(如采用C/C++编写算法和性能要求较高的部分,而采用C#、VB.Net编写软件的界面),最后将不同的部分融合到一起,组成完整的软件。
当软件的不同部分组合到一起的时候,软件难免还有Bug,需要调试软件,排除Bug,已达到发行软件的要求。如果在调试过程中,无法达到源代码级的调试,将是非常费时费力的工作,并且工作效率要大打折扣。
VisualStudio IDE提供了在不同语言和委托代码、本地代码之间的源代码级调试功能。这里以Visual Studio 2017版为例进行说明。
2 在C#中调试C风格函数
首先,生成一个dll库,其中导出一个函数的原型如下:
#ifdefined(__cplusplus)
extern"C"
{
#endif
int CDLL_API __stdcall Sum(int x, int y);
#ifdefined(__cplusplus)
}
#endif
函数的实现如下:
int CDLL_API __stdcall Sum(int x, int y)
{
return (x + y);
}
在C#的调用端说明代码如下:
private const string _dllName = "cDll.dll";
[DllImport(_dllName,CallingConvention = CallingConvention.StdCall)]
public extern static int Sum(int x, int y);
调用代码如下:
int x =Sum(100, 200);
在C#项目属性的“调试”选项卡,勾选“启用本地代码调试”,如下图所示:
按F5建进行调试,如下图所示
单步调试进入源代码,如下图
备注:
上述过程包括两个工程,cDll工程为C++的工程,DllTest工程为C#的工程。
在cDll工程属性的后期生成事件中,添加如下命令:
xcopy $(TargetDir)*.dll $(SolutionDir) /y
xcopy $(TargetDir)*.pdb $(SolutionDir) /y
在DllTest工程属性的生成事件页中,在后期生成事件命令行框中,添加如下命令:
xcopy $(SolutionDir)*.dll $(TargetDir) /y
xcopy $(SolutionDir)*.pdb $(TargetDir) /y
3 在C#中调试C++/CLI封装后的代码
在解决方案中添加ClrDll工程,如下图所示:
其中关键实现代码如下:
int ClrDll::ClrCls::Sum(int x, int y)
{
return (x + y);
}
double ClrDll::ClrCls::Multiply(double a, double b)
{
return 2.0 * a * b;
}
在DLLTest工程中引用ClrDll工程,然后按照C#的方法,调用ClrDll工程中的类,如下图
OK,各位同学可以尽情的在源代码级调试你的C++/CLI代码吧!
4 小结
本文给出了在C#工程中调用C代码风格动态库,并进行源代码级调试的方法,以及C++/CLI风格组件的调试方法,有了上述方法后,我们就可以在C#中带C/C++代码进行调用和方便调试了。