如何调试解决方案中包含的非托管C ++代码

时间:2012-06-21 15:27:50

标签: c++ debugging .net-4.0 pinvoke swig

我正在使用第三方专有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

从C#包装器传递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;
}

1 个答案:

答案 0 :(得分:0)

当你有一个托管exe并且想要调试它使用的本机DLL时,你需要告诉调试器。不要使用调试器类型自动,默认值是什么。使用混合安装。

auto将识别托管exe并允许托管调试。这不是调试本机C ++代码所需要的。

您可以在项目属性的调试部分找到调试器类型设置。