在Visual Studio 2015中调试本机应用程序加载的托管DLL
Debug a Managed DLL loaded by Native Application in Visual Studio 2015
我正在使用一个特定的应用程序,该应用程序支持作为托管C#DLL的"扩展"。应用程序本身是一个本地应用程序,我没有它的源代码
我能够让应用程序加载DLL,并且我可以验证我的函数是否被调用。我想要的是能够在DLL运行时调试我的扩展代码。我可以使用Visual Studio附加到本机应用程序的进程,但是,当我收到"没有加载符号…"错误时,我无法设置任何断点。PDB文件位于DLL旁边。
在我看来,Visual Studio调试器似乎无法识别我的托管C#代码,尽管DLL显然正在使用中。例如,如果我浏览"模块"视图,我将无法在列表中看到我的DLL。
阅读一些VisualStudio支持页面,听起来有一个"混合模式",我通常会在运行应用程序的项目上启用它。但是,由于我实际上并没有构建应用程序,因此无法更改此设置。
有人知道是否还有其他方法可以做到这一点吗?
Visual studio将在列表中显示您的DLL(如果已加载),并且程序使用的是正常的.net运行时。例如,如果它使用的是经过篡改的或单声道的东西,那么它可能不存在。
我不认为你没有非托管程序的源代码是这里的问题。"混合模式"不是您在项目中设置的。这是您为VS设置的,以了解从VS启动项目时使用的调试模式。在附加到进程时,您可以选择更多选项,这对您来说很重要。
我用这个项目来检验这个理论:https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0
我构建了发布模式并删除了PDB,并且能够在附加到进程时手动选择调试器类型,从而使用VS2015在CSClassLibrary(位于static int GetStringLength
)中找到断点。
如果你让它自动选择,并且你有一个时间问题(连接与.net启动与dll加载),那么在你连接时.net可能不会启动,并且它不知道在启用.net调试器的情况下连接。因此,手动指定它应该会有所帮助。
此外,在解决调试时序问题时,一个标准的技巧是在c#代码中放入System.Diagnostics.Degger.Break(),这将确保当您确信您的c#代码正在(希望是正常的).net运行时,您有机会连接visual studio。
Visual Studio将在连接到的进程尚未加载DLL时显示该错误。只需忽略该错误并像往常一样设置断点。当本机应用程序将DLL加载到内存中时,断点图标应变为红色并按预期工作。
- Python ctypes:不会按预期加载 dll
- 在 Linux 平台的 C++ 中动态加载 DLL
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 了解加载库无法加载 DLL 的原因
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- dll 生成成功,但在加载 dll 时执行错误
- QT 加载.dll不调用解析
- 通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- C++插件不能延迟加载dll时
- Java加载DLL,该DLL从JNI中的另一个DLL导出方法
- C++ 动态加载 DLL 错误
- GHCi 无法在 Windows 上加载.dll lib(C++ lib)
- 使用C++应用程序加载 DLL
- System.DllNotFoundException:无法使用 dotnet core 加载 DLL
- 当应用程序在不同系统上运行时,无法加载DLL异常
- 如何停止二级IMPLICITLY加载DLL的DLL劫持
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- 如何在Acrobat JavaScript中加载DLL文件