MSBuildWorkspace现在在我用于构建应用程序的计算机上显示文档。
我见过Roslyn workspace for .NET Core's new .csproj format,但就我而言,它在开发计算机上运行良好(填充了文档),但在另一台计算机上对同一项目是空的。
所以我不确定为什么它可以在我的开发计算机上运行,但不能在我的其他计算机上运行......
这是代码:
public static IReadOnlyList<CodeFile> ReadSolution(string path)
{
List<CodeFile> codes = new List<CodeFile>();
using (MSBuildWorkspace workspace = MSBuildWorkspace.Create())
{
var solution = workspace.OpenSolutionAsync(path).Result;
foreach (var project in solution.Projects)
{
//project.Documents.Count() is 0
foreach (var doc in project.Documents)
{
if (doc.SourceCodeKind == SourceCodeKind.Regular)
{
StringBuilder sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
var source = doc.GetTextAsync().Result;
source.Write(sw);
sw.WriteLine();
}
codes.Add(new CodeFile(doc.FilePath, sb.ToString()));
}
}
}
}
return codes;
}
答案 0 :(得分:1)
事实证明,较新版本的MSBuildWorkspace不会在失败时抛出异常,而是引发一个事件WorkspaceFailure。 (https://github.com/dotnet/roslyn/issues/15056)
这表明所需的构建工具(v15 / VS2017)不可用。新的2017 Build Tools安装程序对于我们的最终用户来说太复杂了,安装速度比2015年构建工具安装程序慢得多。
相反,我提出了这种不太健壮的方法来避免这种依赖:
public static IReadOnlyList<CodeFile> ReadSolution(string path)
{
List<CodeFile> codes = new List<CodeFile>();
var dirName = System.IO.Path.GetDirectoryName(path);
var dir = new DirectoryInfo(dirName);
var csProjFiles = dir.EnumerateFiles("*.csproj", SearchOption.AllDirectories);
foreach(var csProjFile in csProjFiles)
{
var csProjPath = csProjFile.Directory.FullName;
using (var fs = new FileStream(csProjFile.FullName, FileMode.Open, FileAccess.Read))
{
using (var reader = XmlReader.Create(fs))
{
while(reader.Read())
{
if(reader.Name.Equals("Compile", StringComparison.OrdinalIgnoreCase))
{
var fn = reader["Include"];
var filePath = Path.Combine(csProjPath, fn);
var text = File.ReadAllText(filePath);
codes.Add(new CodeFile(fn,text));
}
}
}
}
}
return codes;
}
答案 1 :(得分:0)
我有同样的问题 我正在使用.Net Core控制台应用程序。
我注意到Microsoft.CodeAnalysis.Workspaces.MSBuild发出警告:
使用'.Net Framework,version = v4.6.1'而不是项目目标框架'.NetCoreApp,Version = v2.1'恢复了Microsoft.CodeAnalysis.Workspaces.MSBuild 2.10.0软件包。该软件包可能与您的项目不完全兼容。
我更改为.Net Framework Console App,可以访问文档。