我创建了此测试控制台应用程序,以使用Roslyn脚本引擎(在Microsoft.CodeAnalysis.CSharp.Scripting nuget包中)运行一些C#代码。

     string code = "int test = 123;\r\nConsole.WriteLine(\"hello, world!\");";
     var options = ScriptOptions.Default.WithImports("System");
     var script = CSharpScript.Create(code, options);
     await script.RunAsync();
这可行,但是现在我还希望以某种方式调试正在执行的脚本。有没有办法做到这一点?

最佳答案

通过将代码写入临时文件,然后添加指向该文件的调试信息,找到了一种实现方法。然后,我可以进入RunAsync调用,Visual Studio将加载临时文件,显示执行指针,并让我检查变量。

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.IO;
using System.Text;

namespace RoslynScriptingTest
{
   class Program
   {
      static async Task Main(string[] args)
      {
         string code = "int test = 123;\r\nConsole.WriteLine(\"hello, world!\");";
         string tmpFile = Path.GetTempFileName();
         var encoding = Encoding.UTF8;
         File.WriteAllText(tmpFile, code, encoding);
         try
         {
            var options = ScriptOptions.Default
               .WithImports("System")
               .WithEmitDebugInformation(true)
               .WithFilePath(tmpFile)
               .WithFileEncoding(encoding);
            var script = CSharpScript.Create(code, options);
            await script.RunAsync();
         }
         finally
         {
            File.Delete(tmpFile);
         }
         Console.ReadKey();
      }
   }
}
仅在Visual Studio调试器设置中启用了“仅我的代码”时,调试似乎才起作用。
在我的实际用例中,实际上是从XML文件加载代码,因此,如果可以指向该原始文件并以某种方式映射行号会更好。但这已经是一个好的开始。

关于roslyn - 使用Roslyn CSharpScript执行的调试脚本代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51044585/

10-12 12:49
查看更多