我需要使用CodeDomProvider.CompileAssemblyFromSource
来编译一些代码。如何去调试它?基本上,我想编译它,创建一个类型的实例,然后进入该类型的代码。是否可以调试在运行时编译的代码?
8
A
回答
7
当我发布一个问题后,我意识到我的问题是我从字符串生成程序集,而不是从文件生成。在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
0
您是否尝试使用您的代码从VS中的调试>附加到进程功能附加到进程?
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中找到。
相关问题
- 1. 调试运行时编译代码?
- 2. 编译器是否只编译可以执行的代码?
- 3. 在运行时编译运行代码
- 4. gcc是否可以不编译代码?
- 5. 在调试过程中是否可以运行额外的代码行
- 6. 是否有可能在.NET中运行时编译和执行新代码?
- 7. 是否可以在MATLAB环境内外执行编译代码?
- 8. 是否可以在Open JDK 8中编译代码并在Oracle JRE中运行?
- 9. 是否可以在LLVM-vs2014的源代码级进行调试?
- 10. 是否可以在iOS上编译为Arduino编写的代码?
- 11. 新的Android运行时(ART)是否仅编译Java代码AOT?
- 12. 是否可以在运行时禁用条件编译符号?
- 13. Fortran 95编译器是否可以编译Fortran 77代码?
- 14. 是否可以在C#中运行时创建/执行代码?
- 15. 在运行时编译java代码
- 16. 在编译时运行任意代码
- 17. 如何在运行时编译代码
- 18. 在运行时编译renderscript代码
- 19. 是否可以让一段代码仅在调试期间运行?
- 20. 我可以vb.net运行在编译时
- 21. 是否可以编译Python以在V8引擎上运行?
- 22. 是否可以在Android Studio中编译简单的Java代码?
- 23. 是否有可能运行TDM64-GCC编译器运行代码:: blocks
- 24. 是否可以在特定时间段运行代码?
- 25. 是否可以在运行时从java代码创建EMF包?
- 26. Javascript代码仅在调试时运行
- 27. 你可以在Windows上运行并编译swift代码吗?
- 28. 可以编译一个groovy代码在JRE中运行吗?
- 29. 是否可以使用全局变量进行调试代码
- 30. 使用maven码头时:运行 - 是否可以禁用编译步骤?
你是什么意思“与内存选项”?你有没有试图简单地将调试器连接到正在运行的进程? – 2011-04-08 13:38:57
尽管这可能不是你想要的,那么只是为了调试的目的,将程序集生成到磁盘并将其加载,就好像它在现有程序集的哪里一样?我知道需要在运行时生成程序集,但是在编译时选择某些运行时条件并将其重新生成没有任何问题:) – OregonGhost 2011-04-08 13:40:30