【问题标题】:SGen does not use FileVersion from parent assemblySGen 不使用父程序集中的 FileVersion
【发布时间】:2012-09-11 14:09:02
【问题描述】:

似乎 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 头的完整文件的哈希。

【问题讨论】:

    标签: c# .net sgen


    【解决方案1】:

    解决此问题的方法是创建一个包含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 命令添加到您的构建后事件中,瞧!您将获得一个带有 AssemblyFileVersion 和其他您想要的程序集属性的 XmlSerializer DLL。

    【讨论】:

    • 这是一个很好的解决方案。虽然我曾希望我不需要提供一个虚拟的 AssemblyInfo.cs 来强制 sgen 使用父程序集文件版本。
    • 我正在尝试使用您的答案,但我收到 XmlSerializerAssemblyInfo.cs 文件的文件未找到错误。我的文件完全到位,并且正在使用完整路径来引用它。知道这里可能出了什么问题吗??
    猜你喜欢
    • 2010-11-06
    • 2015-10-03
    • 2012-11-02
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多