[英]Use assembly from a library which has been created through ILMerge
我已经使用工具ILMerge创建了一个程序包。
有一个程序集(称为A
)是该打包的程序集的一部分,该程序集将由另一个程序集使用,而该程序集不包含在该程序包中(称为B
)。
现在我要做的是创建一个引用打包的程序集和B
。 现在,我想这样做:
public void Foo()
{
var obj = new Bar(); // Bar is part of `A`
var someFactory = new Factory(); // is part of `B`
someFactory.DoSomething(obj);
// compiler error here, which says I need to reference the assembly which contains `Bar`
}
我确保包装中包含的程序集A
和B
引用的程序集相同。
我在这里想念什么吗?
更新更多上下文
我们有一个数据模型项目,其中有很多相关项目(首先我知道这很不好,但是它的遗留代码:-(),所以我想将所有这些程序集合并为一个,以便更多地使用该数据模型程序集在多种解决方案中轻松实现。
B
引用A
,而不是您构想的任何怪异的,笨拙的合并程序集。 它可能包含A
所有类型,但不是 A
-程序集标识很重要。 MyMergedPackage.Bar
不是A.Bar
,即使他们使用与名称空间完全相同的类型名称。
有多种可能的解决方案。
首先也是最明显的是,您也可以简单地合并B
在典型的ILMerge方案中,您将所有程序集(包括主可执行文件)合并到一个光荣的奇点中,因此不会出现此问题。 我假设您有充分的理由不这样做。
您可以简单地将合并的程序集称为A
,即使它是A
加更多功能。 如果A
具有强名,则需要为合并的程序集使用相同的名称(版本和全部)。 这样可以使B
满意,这也许就足够了,但是如果您开始添加想要整体的一部分的多个程序集,那么它将不起作用(您不能简单地以不同的名称来复制A
,因为类型不会被识别为相同的名称)。
如果您的.NET版本足够新,则可以创建一个新程序集A
,该程序集仅包含将Bar
转发给新程序集的类型。 这个A
只会是原始内容的占位符,并且只会分发给B
和其他朋友以使他们开心。 如果您使用这种方式有很多类型,那么这很尴尬,您需要自动帮助。 我还没有立即知道。 在大多数情况下,它还是会破坏合并点,因为无论如何您最终都会再次遇到多个程序集。
在编译时,只需使用单独的程序集。 部署时,将它们全部替换为合并的部件。 使用AppDomain.AssemblyResolve
处理程序在代码中进行分类,以在运行时修复实际的类型加载(只需将所有未知数重定向到合并的程序集)。 这可能需要谨慎修改,以确保事件在运行时需要查找任何引用的程序集之前触发(静态构造函数可能会在这里破坏您的乐趣)。
免责声明:我没有测试过这些解决方案中的任何一个; 如果不起作用,请及时通知我,以便我解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.