Debugging 调试包装在C+;中的静态库时,调试器不会进入本机代码+/CLI动态链接库

Debugging 调试包装在C+;中的静态库时,调试器不会进入本机代码+/CLI动态链接库,debugging,dll,c++-cli,mixed-mode,Debugging,Dll,C++ Cli,Mixed Mode,在一个C#应用程序中,我引用了一个原生C静态库,它被包装在一个C++/CLI DLL中。我选择了静态库而不是DLL,因为我还有其他与向用户发布应用程序相关的约束。在本论坛提供的众多主题中,我发现了以下实现 主要内容: { MyCLRDLL test = new MyCLRDLL(); if(test.go()) Console.WriteLine("Hello, wrld"); } 在DLL项目中,文件MyCLRDLL.hpp #include "MyNativeLib.h" #pra

在一个C#应用程序中,我引用了一个原生C静态库,它被包装在一个C++/CLI DLL中。我选择了静态库而不是DLL,因为我还有其他与向用户发布应用程序相关的约束。在本论坛提供的众多主题中,我发现了以下实现

主要内容:

{
  MyCLRDLL test = new MyCLRDLL();
  if(test.go()) Console.WriteLine("Hello, wrld");
}
在DLL项目中,文件MyCLRDLL.hpp

#include "MyNativeLib.h"
#pragma comment(lib, "MyNativeLib.lib")
namespace InteropTest {
public ref class MyCLRDLL
{
  CMyNativeLib* mInt ;
  public:
    MyCLRDLL()  { mInt = CMyNativeLib_New() ;} ;
    ~MyCLRDLL() { CMyNativeLib_Delete(mInt) ;} ;
    bool go() { return mInt->areYouThere()  ;} ;
};
}
#include "MyNativeLib.h"
namespace InteropTest {
extern "C" __declspec(dllexport) CMyNativeLib* CMyNativeLib_New(){return new CMyNativeLib() ;}
extern "C" __declspec(dllexport) void CMyNativeLib_Delete(CMyNativeLib* pLib){delete pLib;}
bool CMyNativeLib::areYouThere() { return true ; }
}
在本地项目中,MyNativeLib.h

namespace InteropTest
{
class __declspec(dllexport) CMyNativeLib
{
public:
  CMyNativeLib() {};
    ~CMyNativeLib(){};
  bool areYouThere() ;
} ;
extern "C" __declspec(dllexport) CMyNativeLib* CMyNativeLib_New();
extern "C" __declspec(dllexport) void CMyNativeLib_Delete(CMyNativeLib* pLib);
}
MyNativeLib.cpp

#include "MyNativeLib.h"
#pragma comment(lib, "MyNativeLib.lib")
namespace InteropTest {
public ref class MyCLRDLL
{
  CMyNativeLib* mInt ;
  public:
    MyCLRDLL()  { mInt = CMyNativeLib_New() ;} ;
    ~MyCLRDLL() { CMyNativeLib_Delete(mInt) ;} ;
    bool go() { return mInt->areYouThere()  ;} ;
};
}
#include "MyNativeLib.h"
namespace InteropTest {
extern "C" __declspec(dllexport) CMyNativeLib* CMyNativeLib_New(){return new CMyNativeLib() ;}
extern "C" __declspec(dllexport) void CMyNativeLib_Delete(CMyNativeLib* pLib){delete pLib;}
bool CMyNativeLib::areYouThere() { return true ; }
}
调试器没有进入mInt->areYouThere()函数。为什么会这样?本机部件中的断点也不会被捕获

为MyCLRDLL加载符号,“启用非托管代码调试”在C#项目上处于活动状态,“调试/调试器类型”在两个C项目中都设置为“混合”,在常规选项中,大多数相关的内容似乎都已选中

这是否意味着MyCLRDLL.pdb文件不包含lib代码中的调试信息?如何检查


(可能与未回答的问题相同)

我尝试了与您相同的设置。C.exe项目,引用了具有CLR支持的.dll项目,该项目引用了纯本地C++代码的.LIB。 首先,在可执行项目属性中,必须在“调试”选项卡的“本机代码”中启用调试。 接下来,您将无法在附加了调试器的情况下运行,因为它不会加载CLR本机部分的符号。我成功地在没有附加调试程序的情况下运行,然后将CLR项目设置为“作为启动项目”。在此之后,必须使用CTRL+ALT+P将本机代码附加到进程,并将“附加到:”。
这对我来说很有效。

我尝试了与您相同的设置。C.exe项目,引用了具有CLR支持的.dll项目,该项目引用了纯本地C++代码的.LIB。 首先,在可执行项目属性中,必须在“调试”选项卡的“本机代码”中启用调试。 接下来,您将无法在附加了调试器的情况下运行,因为它不会加载CLR本机部分的符号。我成功地在没有附加调试程序的情况下运行,然后将CLR项目设置为“作为启动项目”。在此之后,必须使用CTRL+ALT+P将本机代码附加到进程,并将“附加到:”。
这对我来说是有效的。

这是出于设计,您不能单步从托管代码转换为非托管代码。必须在本机代码上设置断点。当然,不要忘记启用非托管代码调试。好的,但是当我在本机代码上设置断点(示例中为@areYouThere函数)时,它不会停止,即使启用了非托管代码调试。你试过这个具体的例子吗?事实上,你至少可以在VS2013中从托管exe(C#)进入非托管代码dll(C++),所以我想知道静态库的关键是prb。最后切换到VS2013。我知道调试混合模式,打开选项>调试>常规>兼容性模式。这是出于设计,您不能单步从托管代码转换为非托管代码。必须在本机代码上设置断点。当然,不要忘记启用非托管代码调试。好的,但是当我在本机代码上设置断点(示例中为@areYouThere函数)时,它不会停止,即使启用了非托管代码调试。你试过这个具体的例子吗?事实上,你至少可以在VS2013中从托管exe(C#)进入非托管代码dll(C++),所以我想知道静态库的关键是prb。最后切换到VS2013。我可以知道调试混合模式,选项>调试>常规>兼容性模式打开。