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
获得。
我开始想知道如何使用来自 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
获得。