Visual Studio中引用DLL的Version属性来源及PowerShell读取方法咨询
问题解答
VS引用面板中Version属性的来源
你在Visual Studio引用属性面板看到的Version属性,不是DLL文件本身内置的元数据属性,而是该引用对应的NuGet包的发布版本号。
以你测试的System.Net.Http为例,VS面板显示的4.3.2是NuGet包的官方发布版本,微软为了保证运行时向后兼容,会单独维护三个独立的版本号:
- NuGet包版本:用于包管理场景,也就是你在VS面板看到的版本,每次包功能更新时迭代
- 程序集版本(AssemblyVersion):CLR加载程序集时的匹配依据,System.Net.Http的程序集版本长期固定为4.0.0.0,避免旧代码引用时出现不匹配错误
- 文件版本(FileVersion):对应单DLL的编译迭代号,和.NET Framework的补丁更新同步,也就是你通过
VersionInfo读到的4.6.25220.01
PowerShell读取该版本的实现方法
根据你的项目引用格式分两种情况处理:
1. 新版SDK风格项目(使用PackageReference管理包)
直接解析csproj项目文件的XML节点即可:
# 替换为你的csproj文件路径 $csprojPath = "C:\Project\Test.csproj" $projXml = [xml](Get-Content $csprojPath -Encoding UTF8) $packageRefs = $projXml.Project.ItemGroup.PackageReference | Where-Object { $_ } foreach ($ref in $packageRefs) { Write-Host "包名:$($ref.Include),VS面板显示版本:$($ref.Version)" }
2. 旧版.NET Framework项目(使用packages.config管理包)
解析项目目录下的packages.config文件:
# 替换为你的packages.config文件路径 $configPath = "C:\Project\packages.config" $configXml = [xml](Get-Content $configPath -Encoding UTF8) $packages = $configXml.packages.package foreach ($pkg in $packages) { Write-Host "包名:$($pkg.id),VS面板显示版本:$($pkg.version)" }
额外匹配校验
如果需要对应到实际的DLL文件,你可以到项目同级的packages目录下查找,目录名格式为包名.包版本,比如你测试的路径packages\System.Net.Http.4.3.2\中的4.3.2就是和VS面板一致的NuGet包版本。
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

