6

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

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

我想使用 ILMerge 将Foo.Core,Foo.Api合并Newtonsoft.Json到一个名为Foo. 那是容易的部分。

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

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

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

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

有没有可靠的方法来做到这一点?

4

2 回答 2

3

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

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

  1. 构建解决方案。
  2. 在主程序集上运行 ILMerge,输出是条件引用中的文件。
  3. 重建解决方案,但这次因为存在合并程序集,非合并程序集或附属程序集现在将具有正确的引用。
于 2011-01-07T04:06:28.720 回答
2

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

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

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

于 2010-05-08T04:59:23.243 回答