Roslyn Workspace API:将解决方案中的每个项目发送到 dll

Roslyn Workspace API : Emit each Project inside Solution to dll

我开始想知道如何使用来自 Rolsyn 的工作区 API 和编译器 API 发出 C# 项目。

这是我目前得到的:

var msBuild = MSBuildWorkspace.Create();

var sln = msBuild.OpenSolutionAsync
    (@"D:\User\Documents\visual studio 14\Projects\ConsoleApplicationWorkspaces"
    +@"\ConsoleApplicationWorkspaces.sln").Result;

foreach (var item in sln.Projects)
{
    EmitProject(item);
}


public static async void EmitProject(Project proj)
{
   var c = await proj.GetCompilationAsync();

   var options = new CSharpCompilationOptions
    (OutputKind.DynamicallyLinkedLibrary);

   c = c.WithOptions(options);

   c = c.AddReferences(proj.MetadataReferences);

   var result = c.Emit("my" + proj.Name + ".dll");

   Console.WriteLine(r.Success);
}

此代码无效。 根据诊断信息,我没有添加 "System.Runtime"、"System.Linq" 等引用。

使用 Workspace API 我可以获得我需要的参考,但我想我仍然添加错误。

您不需要更改从 Project.GetCompilationAsync 返回的选项或引用。您应该可以直接调用 Emit

请注意,您应该按拓扑排序顺序发出项目,您可以从 Solution.GetProjectDependencyService 获得。