【问题标题】:Referencing assemblies created with ILMerge in Visual Studio projects在 Visual Studio 项目中引用使用 ILMerge 创建的程序集
【发布时间】:2010-05-06 03:19:29
【问题描述】:

我在 Visual Studio 中有一个包含 5 个项目的解决方案。它们是:

  • Foo.Core:核心功能
  • Foo.Api:生成的代码构建在核心之上
  • Foo.Web:特定于 Web 的扩展程序
  • Foo.Web.Mvc:MVC 特定的扩展
  • Newtonsoft.Json:第三方库

我想使用 ILMerge 将 Foo.CoreFoo.ApiNewtonsoft.Json 合并到一个名为 Foo 的程序集中。这是最简单的部分。

我遇到的问题是Foo.WebFoo.Web.Mvc 都需要引用所有三个合并的程序集。

如果我引用原始程序集,在我执行 ILMerge 后它们将具有无效的引用。

如果我引用 ILMerged 程序集,我必须引用一个调试程序集,然后在打包所有内容之前对其进行更改,这似乎并不理想。

我尝试创建一个名为 Foo 的项目,它引用了 3 个合并的程序集并将其自己的输出替换为 ILmerged 程序集,但这似乎根本不起作用。

有可靠的方法吗?

【问题讨论】:

    标签: .net ilmerge


    【解决方案1】:

    我知道我来晚了,但我们一直在努力解决同样的问题,这就是我们如何解决的。

    首先,我们编辑了所有未合并或附属项目的 csproj 文件,以根据文件的存在将conditional reference 用于外部程序集。在这种情况下,我们将测试合并程序集是否存在。然后我们运行了一个构建脚本,它执行以下操作:

    1. 构建解决方案。
    2. 在主程序集上运行 ILMerge,输出是条件引用中的文件。
    3. 重新生成解决方案,但这次因为存在合并程序集,非合并程序集或附属程序集现在将具有正确的引用。

    【讨论】:

    【解决方案2】:

    ILMerge 旨在将新的包/组件创建为盒装“产品”(API、程序...),以简化程序集管理,如部署、gac 引用、程序集可见性等,无论是多合一使用还是外用,不可混用。

    我猜你必须在你的主程序集/项目(Foo.Api?)上设置一个PostBuildEvent,如果你的Foo.WebFoo.Web.Mvc 项目中有一个或一个PreBuildEvent 来生成合并的@ 987654328@ 将在您的 Foo.WebFoo.Web.Mvc 项目中作为外部程序集引用。

    您可以通过设置 MsBuild 任务使其在 Visual Studio 中更加集成。一个sample(来自 Stackoverflow)。

    【讨论】:

    • 是的,我试过这样做,但无法获得我想要的效果。看起来 ILMerge 需要保留用于发布前的最后一步,而不是编译时的事情。
    • 我认为如果您的项目以正确的顺序构建,您可以实现这一点。您是否设置了项目依赖项以确保构建顺序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多