我注意到大多数(所有?) .winmd 文件的版本 255.255.255.255 ,如:
Windows,Version = 255.255.255.255,Culture = neutral,PublicKeyToken = null
Metro应用程序引用此版本号的此类程序集。
此外,Windows.winmd本身也引用了:
mscorlib,版本= 255.255.255.255,文化=中立,PublicKeyToken = b77a5c561934e089
但是,据我所知,具有此版本号的程序集不存在。
此版本号是否具有特殊含义?有没有这方面的文件?
答案 0 :(得分:8)
ECMA 335组件需要有版本号。但是Windows运行时类型解析算法不使用版本号,因此创建winmd格式的团队为程序集版本号选择了任意版本号255.255.255.255。
这有助于确保在进行类型解析时没有人尝试使用.Net类型解析算法(它不完美,不幸的是有些工具仍然使用.Net类型解析算法)。
哦,mscorlib引用是一个形式参考 - ECMA 335要求所有typeref都有相应的assemblyref,而WINMD文件格式选择将typerefs用于某些ECMA 335类型作为特定类型的指示符。例如,winrt“enum”构造表示为扩展“System.Enum”的类型 - 对于winmd文件,“System.Enum”部分只是一个字符串(它可能是任何东西),并且无法解析为一个真实的类型。该字符串在元数据中表示为typeref,typerefs必须具有assemblyref - 我们选择使用mscorlib版本的System.Enum作为枚举的assemblyref,因为它很方便。
答案 1 :(得分:3)
请记住.winmd文件包含WinRT接口的元数据。 Windows不能假设将使用任何特定版本的.NET。 Windows 8将比.NET 4.5长得多。
.NET项目也不能假设它可以在任何特定版本的Windows上运行。它应该在Windows 8上和在Windows 10上一样好用。
因此将255.255.255.255解释为“任何版本”。