Придумал способ сделать это, записав код во временный файл и добавив отладочную информацию, указывающую на этот файл. Затем я могу перейти к вызову 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 void 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);
script.RunAsync().Wait();
}
finally
{
File.Delete(tmpFile);
}
Console.ReadKey();
}
}
}
Кажется, что отладка работает только тогда, когда в настройках отладчика Visual Studio включено «Просто мой код».
В моем случае я загружаю код из файла XML, поэтому было бы лучше, если бы я мог указать на этот исходный файл и как-то отобразить номера строк. Но это уже хорошее начало.