Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio中调试第三方DLL?_C#_.net_Debugging_Dll - Fatal编程技术网

C# 在Visual Studio中调试第三方DLL?

C# 在Visual Studio中调试第三方DLL?,c#,.net,debugging,dll,C#,.net,Debugging,Dll,我正在使用第三方DLL。对于某些特定情况,DLL中的函数会引发异常。是否可以在Visual Studio中调试DLL 之后,我可以查看代码,但是在Visual Studio中是否有任何简单的方法可以通过代码进行调试?如果DLL使用某种语言,则可以使用类似的工具对其进行反编译,然后根据源代码进行调试 或者,您可以询问供应商是否有可用的源代码。这可能是最简单的方法。基于Andrew的答案,您只需将反编译的源代码视为项目中的新库,并在源代码中设置断点。删除对第三方DLL的所有引用,使其成为正在执行的反

我正在使用第三方DLL。对于某些特定情况,DLL中的函数会引发异常。是否可以在Visual Studio中调试DLL

之后,我可以查看代码,但是在Visual Studio中是否有任何简单的方法可以通过代码进行调试?

如果DLL使用某种语言,则可以使用类似的工具对其进行反编译,然后根据源代码进行调试


或者,您可以询问供应商是否有可用的源代码。这可能是最简单的方法。

基于Andrew的答案,您只需将反编译的源代码视为项目中的新库,并在源代码中设置断点。删除对第三方DLL的所有引用,使其成为正在执行的反编译代码

其他事项:

  • 通过反编译代码或违反与第三方供应商的许可协议,您可能违反了法律。一定要和别人一起复习
  • 如果您要发送给其他开发人员,或者要签入更大的源代码树,则需要确保删除对反编译版本的引用。这很容易忘记
      我以为.NET Reflector有一些调试插件。这是一个更好的主意,因为反编译和重新编译代码通常会失败,您需要在代码中做很多更改来修复它


      尝试一下.NET Reflector调试器。这可能对你有很大帮助。

      我遇到过两种方法:

      1)从正在使用的项目访问DLL项目。 这涉及到在单独的VisualStudio实例中构建DLL,然后通过VisualStudio中的不同项目访问DLL(假设您拥有源代码)。 有许多方法可以实现这一点:

      • 您可以添加
        Trace.WriteLine
        DLL中将显示的语句 在VisualStudio的“输出”窗口中
      • 您可以将
        System.Diagnostics.Debugger.Break()语句添加到DLL代码中。什么时候
        在Visual Studio中运行调用项目,
        程序执行将在此停止。
        从这里您可以添加访问权限
        调用堆栈(包括所有函数)
        在DLL中调用)并设置中断
        点(尽管图标为
        断点将显示为禁用
        和用于中断的悬停文本
        点将读为“断点将
        当前未命中。没有符号
        已为此文档加载了“”
        
      • 如果DLL引发异常(您可以从 如果出现异常,则显示“输出”窗口 由DLL捕获和处理) 您可以告诉VisualStudio在 将引发该类型的异常。 点击Ctrl+Alt+E,找到 抛出异常,然后单击 “扔”栏 例外。从这里开始就是 好像你用过
        System.Diagnostics.Debugger.Break()
        (见上文)
      2)将正在使用的进程附加到DLL项目。 这涉及将VisualStudio调试器挂接到正在运行的进程中

      • 在Visual Studio中打开DLL项目
      • 运行使用DLL的应用程序(此 无法从运行应用程序 自 进程将已经有一个调试器 附于此)
      • 从这里您可以添加断点并逐步完成 在Visual Studio中加载的DLL代码(尽管 断点将显示为禁用 与方法1相同)

      调试两个第三方库以及它本身对我来说都很有用。这是一个来自微软的很棒的调试器,我用它来解决框架内部深层出现的一些棘手问题


      如果是托管DLL,则需要使用(SOS)扩展。它还可以调试本机。您需要了解一些调用堆栈和程序集/指令,才能熟练地使用它。您应该能够确定异常以及导致异常的原因。我们使用WinDbg/SOS发现,例如,在HttpWebResponse中,如果您使用Gzip压缩下载页面,并且服务器返回错误的Gzip头,.NET在线程池中运行解压缩,崩溃将导致进程中断。调试愉快。

      .NET Reflector 6附带了一个Visual Studio加载项,允许您在没有源代码的程序集上使用Visual Studio的逐步调试

      看看这篇博文:

      更多细节

      这仍然是一个非常早期的构建。因此,不能保证它会工作,它可能会破坏您的VisualStudio配置或项目配置。确保您有备份(或源代码管理)用于您在其上使用的任何项目

      请在此下载:

      正如Cesar Reyes在堆栈溢出问题中提到的,5(及更高版本)具有此功能。

      我们应该在这里提到的另一个选项是dotPeek 1.2(ReSharper创建者提供的免费反编译器)。下面是一篇很好的帖子,介绍了如何配置VS symbol server和dotPeek 1.2来调试VisualStudio中的反编译代码:

      这是.Net dll,我有一个反射器,让我尝试一下。感谢.NET Reflector 6附带了一个Visual Studio加载项,允许您在没有源代码的程序集上使用Visual Studio的逐步调试。是的,将代码提取到文件中,将它们添加到dll项目中,然后重新编译dll。将此项目添加到解决方案中,并更改引用以指向该项目。那么你应该可以调试它了。我有一个类似的问题。所有的资源都属于我,但我不能只是把它们添加到引用项目中。有20多个项目涉及。。。下面的解决方案没有一个真正有助于+1提高人们对违反法律或违反许可协议的可能性的认识。我认为这个解决方案对于OP的问题来说可能有点过火,但对于内存泄漏、IIS中的随机崩溃等核心错误来说确实是有益的。。不管怎么说,答案很好,现在只有少数人使用这个,哈哈