【发布时间】:2014-05-04 20:47:31
【问题描述】:
在 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() ;} ;
};
}
而在原生项目中,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"
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 代码的调试信息?如何检查?
(可能与未回答的Debugging an unmanaged C++ static lib included in a CLR .dll 相同的问题)
【问题讨论】:
-
这是设计使然,您不能单步从托管代码进入非托管代码。您必须在本机代码上设置断点。当然不要忘记启用非托管代码调试。
-
好的,但是当我在本机代码(示例中的@areYouThere 函数)上设置断点时,即使启用了非托管代码调试,它也不会停止。你试过这个具体的例子吗?
-
实际上你至少可以在VS2013中从托管exe(C#)进入非托管代码dll(C++),所以我想知道静态库是prb。
-
终于切换到VS2013了。我可以知道调试混合模式,打开选项>调试>常规>兼容模式。
标签: debugging dll c++-cli mixed-mode