我在 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 兼容:
您说您需要支持 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/