我需要使用CodeDomProvider.CompileAssemblyFromSource
编译一些代码。如何进行调试呢?基本上,我想编译它,创建一个类型的实例,然后进入类型的代码。
答案 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?
中的流程功能