我正在使用ILMerge将多个.NET程序集合并,其中包括一些第三方程序集。自从这样做以来,我遇到了几个错误,所有这些错误都可以归结为类型定义与其所定义的程序集相关联。
一个简单的例子是我的App.config中的log4net配置部分定义。它使用type="log4net.Config.Log4NetConfigurationSectionHandler,log4net",但在将log4net程序集合并到我的合并后程序集后,它不会起作用,因为log4net程序集不存在。这不是什么大问题,我只需将程序集名称更改为我的合并后程序集名称就可以了,然后它就可以正常工作了。
稍微复杂一点的例子是二进制序列化类型。我的系统使用二进制序列化来在进程之间发送某些对象。所有可序列化的对象都定义在一个公共程序集中,其他所有项目都引用该程序集。我一直在使用默认的二进制序列化,但当反序列化对象时,它开始失败,并显示无法找到序列化对象所在的合并后程序集的错误。同样,并不是什么大问题,我实现了一个自定义SerializationBinder,它在任何已加载的程序集中查找类型,而不仅仅是给定的程序集。
当序列化类型引用其他可序列化类型时,上一个示例变得更加复杂。我继续遇到越来越多的问题,这些问题变得越来越难以处理。
我想说的重点是,.NET类型系统和ILMerge似乎不太兼容。有没有人有解决这个问题的经验?是否有可能告诉.NET运行时,不关心类型所说的程序集,只需要到任何地方查找它?
注意:请不要回复问我为什么要合并程序集,这不是这个问题的重点。
一个简单的例子是我的App.config中的log4net配置部分定义。它使用type="log4net.Config.Log4NetConfigurationSectionHandler,log4net",但在将log4net程序集合并到我的合并后程序集后,它不会起作用,因为log4net程序集不存在。这不是什么大问题,我只需将程序集名称更改为我的合并后程序集名称就可以了,然后它就可以正常工作了。
稍微复杂一点的例子是二进制序列化类型。我的系统使用二进制序列化来在进程之间发送某些对象。所有可序列化的对象都定义在一个公共程序集中,其他所有项目都引用该程序集。我一直在使用默认的二进制序列化,但当反序列化对象时,它开始失败,并显示无法找到序列化对象所在的合并后程序集的错误。同样,并不是什么大问题,我实现了一个自定义SerializationBinder,它在任何已加载的程序集中查找类型,而不仅仅是给定的程序集。
当序列化类型引用其他可序列化类型时,上一个示例变得更加复杂。我继续遇到越来越多的问题,这些问题变得越来越难以处理。
我想说的重点是,.NET类型系统和ILMerge似乎不太兼容。有没有人有解决这个问题的经验?是否有可能告诉.NET运行时,不关心类型所说的程序集,只需要到任何地方查找它?
注意:请不要回复问我为什么要合并程序集,这不是这个问题的重点。