我有一个内置的解决方案,当我用roslyn加载它时,就像这样:
var workspace = MSBuildWorkspace.Create();
var solutionPath = @"c:\path\to\my.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
然后所有项目都有0个元数据引用。
如果我尝试从这样的引用程序集中获取类型:
var compilation = solution.Projects.First().GetCompilationAsync().Result;
var myType = compilation.GetTypeByMetadataName("SomeTypeNanme);
它永远找不到类型。如果我这样手动添加元数据引用:
var project = project.AddMetadataReference(AssemblyContaningTheType);
然后可以找到类型。
在重要的情况下,我的解决方案针对.NET Framework 4.5.2
这是解析引用的唯一方法,即手动添加元数据引用吗?不能通过引用全部在csproj中的事实来完成此操作吗?我怎么知道我需要添加什么参考?
理想情况下,我希望引用能够自动解决,但是可以使用指针从项目文件中的信息中构建所有必要的元数据引用……
答案 0 :(得分:0)
据我所知,它可能与this issue有关,或者可能与导致this one的this open ticket有关。
引用后者
从同一解决方案引用其他项目的项目的空MetadataReferences
使用的版本: 2.7.0
复制步骤:
使用以下代码打开项目A:
var工作区= MSBuildWorkspace.Create(additionalProperties);
项目项目=工作区。OpenProjectAsync(projectPath).Result;
预期行为:
project.MetadataReferences应该包含项目的引用,例如mscorlib.dll
实际行为:
project.MetadataReferences为空。
答案 1 :(得分:0)
因此,我终于重新考虑了这一点。对我来说,解决方案就是从这个要点开始的:
https://gist.github.com/DustinCampbell/32cd69d04ea1c08a16ae5c4cd21dd3a3
基本上可以强制使用一致版本的MSBuild。
首先添加对Microsoft.Build.Locator的引用(它说它适用于MSBuild 15,但对我来说适用于16)。
然后添加此行:
MSBuildLocator.RegisterDefaults();
在引导程序中的某个位置,然后再使用MSBuildWorkspace打开解决方案。