C# 使用通过ILMerge创建的库中的程序集

C# 使用通过ILMerge创建的库中的程序集,c#,ilmerge,assembly-references,C#,Ilmerge,Assembly References,我已经使用工具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.DoSom

我已经使用工具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
引用的程序集相同

这里有我遗漏的东西吗

使用更多上下文更新


我们有一个datamodel项目,它有很多依赖的项目(我知道这在一开始是不好的,但是它的遗留代码:-()因此,我想将所有这些程序集合并为一个,以便在多个解决方案中更轻松地使用该数据模型程序集。

B
引用了
A
,而不是您编造的任何古怪的deaky合并程序集。它可能包含所有类型的
A
,但它不是
A
——程序集标识问题。
MyMergedPackage.Bar
不是
A.Bar
,即使它们在命名空间中使用完全相同的类型名

有多种可能的解决方案

  • 首先也是最明显的一点,您也可以简单地合并
    B
    。在典型的ILMerge场景中,您将所有程序集(包括主可执行文件)合并到一个光荣的奇点中,因此您没有这个问题。我假设您有充分的理由不这样做

  • 您可以简单地将合并的程序集
    A
    ,即使它是
    A
    加上更多。如果
    A
    有一个强名称,您需要提供相同的名称(版本和全部)添加到合并的程序集。这将使
    B
    保持愉快,这可能就足够了,但如果您开始添加多个需要整体一部分的程序集,这将不起作用(您不能简单地在不同的名称下复制
    a
    ,因为类型不会被识别为相同)

  • 如果你的.NET版本足够新,你可以创建一个新的程序集
    a
    ,其中只包含一个用于新程序集的
    Bar
    。这个
    a
    将只是原始程序集的占位符,并且只分发给
    B
    和各种朋友。如果你有很多这样的类型,这是一个wkward足以让您需要自动帮助。我现在还没有发现任何自动帮助。在大多数情况下,它也会破坏合并的目的,因为您最终会再次遇到多个程序集

  • 在编译时,只需使用单独的程序集。在部署时,将它们全部替换为合并的程序集。使用的处理程序在代码中进行排序,以便在运行时修复实际的类型负载(只需将所有未知重定向到合并的程序集)。这可能需要进行一些仔细的修补,以确保在运行时需要查找任何引用的程序集之前触发事件(静态构造函数在这里尤其会破坏您的乐趣)


免责声明:我完全没有测试过这些解决方案;如果其中一个解决方案不起作用,请随时通知我,以便我可以修复此答案。

因此我不能在项目中使用程序集,然后将其合并,并期望仍能以相同的方式使用它?(
a!=merged.a
)@精确地定义。使用的每个类型都是通过包含它所包含的程序集来引用的,因此,如果您使一个类型在不同的程序集中结束(无论该程序集是如何形成的,通过合并或其他方式),则由您来完成这项工作(通过重命名程序集,或通过在运行时修复解析,或通过更新引用——用合并的程序集作为引用重新编译
B
,将是另一种解决方案)。