2

我正在使用第三方专有 DLL,我无法获得其源代码。但是,我可以使用似乎是使用 SWIG 1.3.39 自动生成的包装器代码。包装器代码包含一个 C++ 文件(使用一些描述 DLL 的头文件)编译为 DLL 和一个 C# 项目,该项目对 C++ 包装器 DLL 进行 PInvoke 调用。

我的项目解决方案中包含的那些 C++ 项目,但是当我在 C++ 代码中设置断点时,我永远不会到达那里。当我尝试在 C# 中按 F11 进入 C++ 函数时,我得到的是“显示程序集”。

我尝试了解决方案 > 比例 > 配置比例,但没有找到任何带有调试非托管/本机代码的选项。

编辑

包装器 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;
}
4

1 回答 1

0

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

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

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

于 2012-06-22T05:10:52.083 回答