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

时间:2016-03-02 15:55:45

标签: 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.DoSomething(obj); 
  // compiler error here, which says I need to reference the assembly which contains `Bar`
}

我确保包含在包中的程序集AB引用的程序集是相同的。

我在这里缺少什么东西吗?

使用更多上下文进行更新

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

1 个答案:

答案 0 :(得分:0)

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

有多种可能的解决方案。

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

  • 您可以简单地调用合并的程序集A,即使它是A还有更多。如果A具有强名称,则需要为合并的程序集指定相同的名称(版本和所有名称)。这将使B感到满意,这可能已经足够了,但是如果您开始添加需要整体的一部分的多个程序集,它将无法工作(您不能简单地以不同的名称复制A,因为类型不会被识别为相同的)。

  • 如果您的.NET版本已经足够新,那么您可以创建一个新程序集A,其中只包含Bar A到您的新程序集。这个B只是原作的占位符,只是为了让function loadAjax() { /* Commented this part since it wont run on the snippet. var range_start = $("#start_shops").val(); var range_end = $("#end_shops").val(); $.ajax({ url:'process_shops.php', data:{start:range_start,end:range_end}, type:'POST', success:function(data){ $("#result_shops").html(data); } }); */ alert("blablabla"); } $("#sub_shops").click(loadAjax); //Add event to click $(document).ready(loadAjax); //Add event to run when page loads.和各种朋友高兴而分发。如果这种方式有很多类型,那么你需要自动化帮助就太尴尬了。我没有立刻意识到。在大多数情况下,它也会失去合并点,因为无论如何你最终会再次使用多个装配。

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

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