0

我使用工具 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相同。

有什么我在这里想念的吗?

更新更多上下文

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

4

1 回答 1

0

B参考资料A,而不是您编造的任何怪异的 deaky 合并程序集。它可能包含 的所有类型A,但它不是 A——程序集标识很重要。MyMergedPackage.Bar不是A.Bar,即使它们使用完全相同的类型名称直至命名空间。

有多种可能的解决方案。

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

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

  • 如果您的 .NET 版本足够新,您可以创建一个新程序集,该程序集A只包含一个类型转发Bar您的新程序集。这A将只是原始的占位符,仅分发以保持B和各种朋友的快乐。如果您以这种方式有很多类型,那么您需要自动帮助就很尴尬了。我没有立即意识到。在大多数情况下,它也相当破坏了合并的意义,因为无论如何您最终都会再次获得多个程序集。

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

免责声明:我完全没有测试过这些解决方案;如果一个不起作用,请让我发布,以便我修复这个答案。

于 2016-03-02T16:44:06.480 回答