2015-01-03 130 views
0

我开始想知道如何使用Rolsyn的Workspace API和Compiler API发布C#项目。Roslyn Workspace API:发布解决方案中的每个项目dll

这是我得到迄今:

var msBuild = MSBuildWorkspace.Create(); 

var sln = msBuild.OpenSolutionAsync 
    (@"D:\User\Documents\visual studio 14\Projects\ConsoleApplicationWorkspaces" 
    [email protected]"\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我可以得到我需要的引用,但我想我仍然会将它们添加错误。

+0

备注:不要写'async void'。 – SLaks

回答

0

您不需要更改从Project.GetCompilationAsync回来的选项或参考。你应该只能直接拨打Emit

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

+0

你能否提供更多关于“你应该只能直接调用Emit”的细节。这不适合我。 – user2932893

+0

为什么需要按照拓扑排序顺序来完成它?项目之间将存在项目引用 - 我们不会依赖于中间项目的磁盘二进制文件。 –

+0

啊,好点,虽然做拓扑秩序会给你诊断一个合理的顺序。 –

相关问题