我有一个使用Roslyn的Visual Studio扩展程序,可以获取当前打开解决方案中的项目,编译并运行其中的方法。该项目可以由程序员进行修改。
我已经成功地从当前的VisualStudioWorkspace中编译了一个项目,并在Visual Studio扩展程序中运行它。
我已经成功地从当前的VisualStudioWorkspace中编译了一个项目,并在Visual Studio扩展程序中运行它。
private static Assembly CompileAndLoad(Compilation compilation)
{
using (MemoryStream dllStream = new MemoryStream())
using (MemoryStream pdbStream = new MemoryStream())
{
EmitResult result = compilation.Emit(dllStream, pdbStream);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
string failuresException = "Failed to compile code generation project : \r\n";
foreach (Diagnostic diagnostic in failures)
{
failuresException += $"{diagnostic.Id} : {diagnostic.GetMessage()}\r\n";
}
throw new Exception(failuresException);
}
else
{
dllStream.Seek(0, SeekOrigin.Begin);
return AppDomain.CurrentDomain.Load(dllStream.ToArray(), pdbStream.ToArray());
}
}
}
然后我可以在当前域中加载程序集,获取其类型并调用方法。
问题是,如果当前加载的解决方案的配置为调试模式,我需要允许程序员设置断点。
我需要从扩展中运行一些代码,并允许它在当前的Visual Studio实例中进行调试。
System.Diagnostics.Debugger.Launch()
是一个创造性的解决方案,这样我就可以指定何时开始调试。 - Tấn Nguyên