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