【发布时间】:2018-12-15 19:07:50
【问题描述】:
我编写了一个编译外部解决方案的单元测试。此解决方案中的一个项目具有 COM 参考 (SHDocVW)。当 Roslyn 尝试编译这个项目时,它给出了一个无法解析这个引用的编译错误。
当我尝试在控制台测试应用程序中做同样的事情时,编译成功,找到了 COM 引用。
var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
var compilation = project.GetCompilationAsync().Result;
var diag = compilation.GetDiagnostics();
if (diag.Any(d => d.Severity == DiagnosticSeverity.Error))
{
Debug.WriteLine($"Error compiling project {project.Name}");
}
}
当我使用 procmon(来自 Sysinternals)查看他尝试解析 SHDocVW dll 的位置时,我看到在控制台应用程序的情况下,他查看了外部解决方案的 obj 文件夹,并在其中找到了该 dll。在单元项目的情况下,他甚至没有尝试解析 dll。手动将 dll 复制到单元测试的输出文件夹不会改变行为。
这种行为可以很容易地在一个小型测试项目中重现。
我不确定这个问题是由 Roslyn 引起的,看来他只是在单元测试期间没有尝试解决这些 COM 引用。
有没有人知道如何解决这个问题?
【问题讨论】:
-
在 MSBuildWorkspace 中加载和编译解决方案的代码在单元测试中与在控制台应用程序中相同。在控制台应用程序中,编译有效,而在单元测试中则无效。所以它本身似乎不是 MSBuildWorkspace 的问题。
标签: c# roslyn roslyn-code-analysis