是否可以调试在运行时编译的代码?

时间:2011-04-08 13:35:48

标签: c# .net visual-studio-2010 compiler-construction codedom

我需要使用CodeDomProvider.CompileAssemblyFromSource编译一些代码。如何进行调试呢?基本上,我想编译它,创建一个类型的实例,然后进入类型的代码。

3 个答案:

答案 0 :(得分:8)

在我发布问题之后,我意识到我的问题是我是从字符串而不是从文件生成程序集。我在DEBUG中返回并更改了代码以使用不同的选项运行,并且我能够从单元测试代码中直接进入。还必须将GenerateInMemory设置为false并将IncludeDebugInformation设置为true。

#if DEBUG
            @params.IncludeDebugInformation = compilationContext.IncludeDebugInformation;
            @params.GenerateInMemory = compilationContext.GenerateInMemory;
            var fileName = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..\" + compilationContext.AssemblyOutputName + ".cs"));
            File.WriteAllText(fileName,compilationContext.StringToCompile);
            return _codeDomProvider.CompileAssemblyFromFile(@params,fileName);
#else
            return _codeDomProvider.CompileAssemblyFromSource(@params, compilationContext.StringToCompile);
#endif

答案 1 :(得分:3)

有趣的问题。我认为你最好的选择是使用WinDbg附加到正在运行的.NET exe进程(我认为你必须在tyoe编译到内存之后这样做,因为EXE的内存地址会改变 - 我假设。)

然后,当在内存中编译并运行类型时,您可以使用SOS.dll中找到的命令搜索该类型。您还可以使用SOS.dll

在内存中放置断点

SOS链接入门

http://rionisimpsoni.wordpress.com/2009/10/08/getting-started-with-windbg-and-sos-dll/

这是一个简单的答案,因为解释如何使用WinDbg和SOS.dll已在网上多次报道。

编辑:

此方法的一个缺点是您将无法看到Visual Studio显示的源代码。在单步执行代码时,您将看到汇编语言。这可能会让你失望:),但如果你坚持下去,并了解一些装配,你可以做足够的调试错误,例如。

您可以做的另一件事是将.NET程序集从内存转储到磁盘上的文件中。这样做的SOS.dll命令现在逃脱了我,我会去寻找它......

啊,这是SaveModule。可以在评论here中找到此示例。

答案 2 :(得分:0)

您是否尝试使用Debug>中的代码附加到流程中?附加到VS?

中的流程功能