c# - 我可以在 .net 4.5 项目上使用分析器吗?

标签 c# .net msbuild continuous-integration

我在 GitHub 上有一个 OSS 项目是针对 AppVeyor CI 上的 .NET 4.5 和 Visual Studio 2017(不是预览版,只是 2017)构建的。

该解决方案构建了一个 COM 插件,它扩展了一个众所周知的可怕的遗留 Win32 IDE,我们已经确定我们需要运行的最早的 Windows 版本是 Vista(因此,.net 4.5 及其 async/await 真棒)。

到目前为止,还不错。现在构建一个 COM 可见的 .net DLL 是一回事,构建一个在进程内运行的 COM 加载项,托管在 20 年前最后一次更新的复杂应用程序中,是另一回事:我们不能依赖 .net垃圾收集不确定地清理 RCW,因此很容易意外泄漏 COM 对象并引入严重的运行时(实际上是拆卸)问题,因此核心贡献者之一是 adding a Roslyn analyzer project to the solution这将通过防止会引入此类泄漏的构建来帮助新老贡献者。

所以解决方案中的所有 .csproj 文件都得到这个差异:

+  <ItemGroup>
+    <Analyzer Include="..\RubberduckCodeAnalysis\RubberduckCodeAnalysis\bin\Release\netstandard1.3\RubberduckCodeAnalysis.dll" />
+  </ItemGroup>

因此需要先构建分析器项目。

.sln diff 显示了新分析器项目的 GUID:

+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RubberduckCodeAnalysis", "RubberduckCodeAnalysis\RubberduckCodeAnalysis\RubberduckCodeAnalysis.csproj", "{A2B4E037-A446-41B9-A304-F91C7C7A6972}"
+EndProject

然后 .sln diff 显示了解决方案的项目之一,以及如何将分析器添加为依赖项以控制构建顺序:

 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rubberduck.Parsing", "Rubberduck.Parsing\Rubberduck.Parsing.csproj", "{A4A618E1-CBCA-435F-9C6C-5181E030ADFC}"
    ProjectSection(ProjectDependencies) = postProject
+       {A2B4E037-A446-41B9-A304-F91C7C7A6972} = {A2B4E037-A446-41B9-A304-F91C7C7A6972}
        {8CE35EB3-8852-4BA1-84DD-DF3F5D2967B0} = {8CE35EB3-8852-4BA1-84DD-DF3F5D2967B0}
    EndProjectSection
 EndProject

这让我想到了我遇到的 AppVeyor 构建错误:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(1603,5): error : Project 'C:\projects\rubberduck\RubberduckCodeAnalysis\RubberduckCodeAnalysis\RubberduckCodeAnalysis.csproj' targets 'netstandard1.3'. It cannot be referenced by a project that targets '.NETFramework,Version=v4.5'. [C:\projects\rubberduck\Rubberduck.Parsing\Rubberduck.Parsing.csproj]

在本地调试构建中,可以手动构建分析器项目,然后可以很好地构建和分析解决方案的其余部分,而无需破解项目依赖项。

虽然在 AppVeyor CI 构建服务器上,分析器项目只是一个 DLL,它是解决方案的一部分,如果我们不告诉它先构建,那么分析器 DLL 就不会被发现,解决方案也会成功'构建。

看起来我被卡住了,无论我从哪一边看问题。我的用户都是Win32用户,我不关心可移植性;不过,我很想在 Windows Vista 上运行,那么有没有一种方法可以让我在 CI 上构建它,而无需将项目重新定位到 .NET Standard 1.3?

最佳答案

如果您查看 documentation of .NET Standard ,您将看到版本 1.3 与 .NET Framework 4.6 兼容:

enter image description here

您说您需要支持 Windows Vista,您很幸运,因为 Windows Vista(需要 SP2)支持的最新版本的 .NET 是 .NET Framework 4.6:.NET Framework system requirements .

因此,我建议您将所有项目更新为 .NET Framework 4.6,您应该不会再看到任何兼容性问题。

关于c# - 我可以在 .net 4.5 项目上使用分析器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50119795/

相关文章:

c# - 将 .NET XMLWriter 与 XSD 结合使用

msbuild - 在 msbuild (12.0) 命令行属性分配上引用宏

Delphi XE3 构建批处理无法使用 Hudson 或 Jenkins 运行 msbuild

c# - 在 Debug模式下进行用户测试——为什么不呢?

c# - 应用程序文件夹的权限

.net - 如果我运行的是 .net 3.5 或 3.5 sp1,我可以在哪里查找?

c++ - MSBuild.exe 不并行构建项目

c# - 单元测试、死锁和竞争条件

c# - 为 .NET 应用启用高性能 GPU

c# - CppCodeGenerator 解析托管 C++