【问题标题】:xmlserializer.dll is not used if the target assembly changes如果目标程序集发生更改,则不使用 xmlserializer.dll
【发布时间】:2017-11-21 20:47:03
【问题描述】:

我正在为我的服务生成一个 xmlserializer dll。这是一个大型网络服务 - 构建大约需要 2 分钟。

为了减少构建时间,我将 xmlserializer 的构建分离到一个单独的 Makefile 项目中——鉴于接口没有改变,我想我可以编译一次,就可以了。

但是,我发现,如果我重新编译服务,xmlserializer 不再使用,并且序列化程序代码正在运行时生成。

有人看过吗?有解决办法吗?什么可能导致 xmlserializer 不再匹配服务程序集?

谢谢。

更新:

好的,我找到了一半的答案......

https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializerversionattribute(v=vs.110).aspx

描述 XmlSerializerVersionAttribute(在生成的 .cs 代码中)。

文件说...

如果基础结构找到名称匹配的程序集,则加载该程序集并基础结构检查 XmlSerializerVersionAttribute 是否匹配找到的程序集版本和父程序集的当前版本。如果版本不匹配,则不使用找到的程序集。而是为序列化生成一个临时程序集。

查看.Net Framework源码可知ParentAssemblyId其实是模块版本id,即

Assembly.GetExecutingAssembly().GetModules()[0].ModuleVersionId

但是,如果我手动加载 xmlserializer 程序集,并更改属性上的 ParentAssemblyId 字段,它仍然不起作用 - 我猜框架会加载它自己的序列化程序程序集副本。

【问题讨论】:

    标签: c# .net xmlserializer


    【解决方案1】:

    我最终添加了一个后期构建步骤来更改程序集的模块 ID(在调试构建中)。

    我尝试了 fody.MVID(如此处所述 can-i-specify-the-module-version-id-mvid-when-building-a-net-assembly ),但我无法让它工作(版本不匹配)。

    最后我使用了这篇博文中的代码-https://blogs.msdn.microsoft.com/johnls/2005/08/13/changing-mvids/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2014-12-09
      • 1970-01-01
      • 2023-03-29
      • 2011-01-10
      • 1970-01-01
      • 2020-10-24
      • 2010-09-18
      相关资源
      最近更新 更多