Roslyn / MSBuildWorkspace不在非开发人员计算机上加载文档

时间:2017-09-30 12:27:55

标签: c# msbuild roslyn

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;
    }

2 个答案:

答案 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,可以访问文档。