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

C# 是否可以调试运行时编译的代码?,c#,.net,visual-studio-2010,compiler-construction,codedom,C#,.net,Visual Studio 2010,Compiler Construction,Codedom,我有一个需要编译一些代码使用。如何调试它?基本上,我想编译它,创建一个类型的实例,然后进入该类型的代码。您是否尝试使用VS中调试>附加到流程功能中的代码附加到流程?有趣的问题。我认为您最好的选择是使用连接到正在运行的.NET exe进程(我认为在内存中编译完tyoe后,您必须执行此操作,因为exe的内存地址将发生更改-我假设) 然后,当该类型在内存中编译和运行时,您可以使用SOS.dll中的命令搜索该类型。您还可以使用SOS.dll在内存中放置断点 开始使用SOS链接 这是一个简单的答案,因为

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

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

有趣的问题。我认为您最好的选择是使用连接到正在运行的.NET exe进程(我认为在内存中编译完tyoe后,您必须执行此操作,因为exe的内存地址将发生更改-我假设)

然后,当该类型在内存中编译和运行时,您可以使用SOS.dll中的命令搜索该类型。您还可以使用SOS.dll在内存中放置断点

开始使用SOS链接

这是一个简单的答案,因为解释如何使用WinDbg和SOS.dll在网络上已经讨论了很多次

编辑:

此方法的一个缺点是,您将无法看到Visual Studio显示的源代码。在逐步完成代码时,将显示汇编语言。这可能已经让您感到不快了:),但如果您坚持使用它,并了解一些汇编知识,例如,您可以做足够的工作来调试错误

您可以做的另一件事是将.NET程序集从内存转储到磁盘上的文件中。SOS.dll命令现在让我无法执行,我要去找它


啊,这是
SaveModule
。这方面的一个例子可以在评论中找到。

在我发布了一个问题后,我意识到我的问题是我是从字符串而不是从文件生成程序集的。我返回并更改了代码,使其在调试时使用不同的选项运行,并且我能够直接从单元测试代码开始。还必须将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

你说的“带内存选项”是什么意思?您是否尝试过简单地将调试器附加到正在运行的进程上?虽然这可能不是您想要的,但是仅仅为了调试目的,将程序集生成到磁盘并将其加载到现有程序集的位置,怎么样?我理解在运行时生成程序集的必要性,但选择某些运行时条件并在编译时重新生成它们并没有什么错:)有趣的观察,这样生成的程序集不必以dll结尾即可使用,它根本不需要任何扩展。+1个好问题和自我回答,对我来说非常合适。我正处于生成和编译测试代码的过程中。威尔金斯:谢谢,很高兴它帮助了别人。我的东西更复杂一点,我生成代码,生成代码,然后编译和执行。因此,能够调试是我在这里必须的。