我正在使用第三方专有DLL,但我无法获得源代码。但是,使用SWIG 1.3.39自动生成的包装代码可供我使用。包装器代码包含一个C ++文件,它编译(使用一些描述DLL的头文件)到DLL和一个C#项目,它使PInvoke调用C ++包装器DLL。
我在项目解决方案中包含的那些C ++项目,但是当我在C ++代码中设置断点时,我从未到达那里。当我在C#中尝试使用F11时,为了进入C ++函数,我得到了“Show Assembly”。
我有解决方案>比例>配置比例,但没有找到任何调试非托管/本机代码的选项。
修改
包装器C ++代码可供我使用,我需要看到我从C#传递的值实际上已传递给C#代码。
// In one file of the C# wrapper:
public string GetKey()
{
// swigCPtr is a HandleRef to an object already created
string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
return ret;
}
// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);
来自C ++包装器的C ++代码。
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
现在正在尝试使用swigCPtr
csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
现在我想看看jarg1是否从swigCPtr获取值;
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
答案 0 :(得分:0)
当你有一个托管exe并且想要调试它使用的本机DLL时,你需要告诉调试器。不要使用调试器类型自动,默认值是什么。使用混合安装。
auto将识别托管exe并允许托管调试。这不是调试本机C ++代码所需要的。
您可以在项目属性的调试部分找到调试器类型设置。