在我的这个上一个问题中,我以为我已经解决了在 VS2022 C# 项目中设置版本信息的问题。 但我似乎又遇到了这个问题,无法弄清楚。 当时和现在的主要区别在于,在上一个问题中我正在研究一个应用程序,而今天我正在研究一个 DLL。
我在 VS2022 项目中明确设置了这些设置
这反映在 csproj 文件的详细信息中:
<PropertyGroup>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Title>blah blah</Title>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<Version>1.0.2</Version>
<FileVersion>1.0.2</FileVersion>
<AssemblyVersion>1.0.2</AssemblyVersion>
<Authors>blah blah</Authors>
<Description>blah blah blah, blah blah</Description>
<Copyright>Copyright blah blah 2024</Copyright>
</PropertyGroup>
但是构建后,当我通过文件资源管理器查看 DLL 属性时,我看到了以下内容:
为了进行比较,我尝试使用 这个 powershell 命令 来检查 DLL,这证实了资源管理器的结果:
另外我还在项目中设置了版权信息,DLL的属性中也是空白的。
那么这是怎么回事? 为什么我无法设置文件或程序集版本?
这对我来说很重要的原因是,我在构建期间生成了一个 NuGet 包,并且该包似乎认为 DLL 是 1.02,但 DLL 不是 1.02,并且当 NuGet 包 DLL 加载到另一个应用程序中时,应用程序失败,因为它找不到预期的 DLL 版本。
FWIW 该 DLL 项目已从 VS2017 升级到 VS2022 项目。 所以自动升级可能遗漏了一些东西。 然而,自项目开始以来,今天是我在将 DLL 的版本属性保留为默认值后实际尝试设置它们的第一天。
在@DennisLi 关于 AssemblyInfo.cs 的问题提示后,我去查看了该问题以及项目中的其他内容。
首先,这个项目没有AssemblyInfo.cs文件。 然而,当查看 csproj 文件的详细信息时,我看到了这一点:
<PropertyGroup>
<TargetFramework>net8.0-windows8.0</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
</PropertyGroup>
关键点是GenerateAssemblyInfo 元素。 这显然是为了控制旧式 AssemblyInfo.cs 文件和新式 SDK 项目文件中程序集等信息的生成。
如果为 false,则该信息来自 AssemblyInfo.cs 文件。 但如前所述,该文件不在当前项目中。 但是,在我更新到 VS2022 项目之前,该文件确实存在于原始 VS2017 项目中。
作为测试,我像这样注释掉了该元素:
<PropertyGroup>
<TargetFramework>net8.0-windows8.0</TargetFramework>
<OutputType>Library</OutputType>
<!--<GenerateAssemblyInfo>false</GenerateAssemblyInfo>-->
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
</PropertyGroup>
这导致预期的信息出现在文件属性中:
看起来在从旧项目转换为新项目的过程中出了问题,我被留在了不确定的位置,版本信息预计位于 AssemblyInfo.cs 文件中,但转换已删除该文件。