1

似乎 SGen 不使用父程序集中的文件版本,而是使用 AssemblyVersion。如果您想保持强名称不变并通过 MSI API 兼容补丁发布,这是有问题的。

例如,如果添加了新数据类型,则需要在目标机器上修补生成的 XmlSerializers 程序集。但是 MSI 只查看文件版本(相等)并且什么都不做。

有没有办法指示 SGen 使用源程序集中的文件版本?

例子:

源程序集:

  [assembly: AssemblyVersion("2.0.0.0")]
  [assembly: AssemblyFileVersion("35.0.0.0")]

生成的序列化程序程序集将在 PE Header for File 和 Product Version 中获得 2.0.0.0。这是错误的。

作为最后的手段,我会考虑修补生成的程序集的文件版本,但我确实担心如果程序集是强命名的,它将不再加载(尚未尝试过),因为至少以前的 .NET 版本确实创建了包含PE头的完整文件。

4

1 回答 1

4

解决这个问题的方法是创建一个包含程序集属性的代码文件,AssemblyFileVersion并告诉sgen包含该文件。

使用以下代码创建一个名为 XmlSerializersAssemblyInfo.cs 的文件:

[assembly:System.Reflection.AssemblyTitleAttribute("title")] 
[assembly:System.Reflection.AssemblyDescriptionAttribute("description")] 
[assembly:System.Reflection.AssemblyCompanyAttribute("company")] 
[assembly:System.Reflection.AssemblyProductAttribute("product")] 
[assembly:System.Reflection.AssemblyFileVersionAttribute("1.2.3.4")]

sgen实用程序允许您使用/c如下方式添加编译器开关:

sgen.exe" /a:"$(TargetPath)" /f /c:/keyfile:"$(ProjectDir)myApp.snk" /c:"$(ProjectDir)XmlSerializersAssemblyInfo.cs"

sgen命令添加到您的后期构建事件中,瞧!您将获得一个具有所需的和其他程序集属性的XmlSerializerDLL 。AssemblyFileVersion

于 2013-05-17T18:29:36.290 回答