2011-04-08 242 views
8

我需要使用CodeDomProvider.CompileAssemblyFromSource来编译一些代码。如何去调试它?基本上,我想编译它,创建一个类型的实例,然后进入该类型的代码。是否可以调试在运行时编译的代码?

+0

你是什么意思“与内存选项”?你有没有试图简单地将调试器连接到正在运行的进程? – 2011-04-08 13:38:57

+1

尽管这可能不是你想要的,那么只是为了调试的目的,将程序集生成到磁盘并将其加载,就好像它在现有程序集的哪里一样?我知道需要在运行时生成程序集,但是在编译时选择某些运行时条件并将其重新生成没有任何问题:) – OregonGhost 2011-04-08 13:40:30

回答

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

有趣的观察,像这样生成的程序集不必以dll结束才能使用,它不会必须有任何扩展。 – epitka 2011-04-08 14:14:05

+0

+1很好的问题和自我回答,非常适合我。我正处于生成和编译测试代码的过程中。这很有用。 – 2011-04-08 14:39:22

+0

@Wilkins:谢谢,很高兴它帮助了别人。我的东西甚至有一点涉及,我生成的代码生成的代码,然后编译和执行。所以能够在这里进行调试对我来说是必须的。 – epitka 2011-04-08 15:37:43

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中找到。

相关问题