2010-05-06 30 views
5

我在Visual Studio中有5个项目的解决方案。它们是:在Visual Studio项目中引用使用ILMerge创建的程序集

  • Foo.Core:核心功能
  • :网络特定的扩展
  • Foo.Web.Mvc:构建在核心的顶部Foo.Web
  • 生成的代码MVC-具体分机
  • Newtonsoft.Json:第三方库

我想用ILMerge合并Foo.Core,和Newtonsoft.Json到一个单一的组件,叫做Foo。这是很容易的部分。

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

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

如果我参考ILMerged程序集,我必须引用一个调试程序集,然后在将所有东西打包之前进行更改,这看起来并不理想。

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

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

回答

2

ILMerge旨在创建一个新的包装/组件作为盒装“产品”(API,Program ...)来简化装配管理,如部署,gac参考,装配可见性等等,以实现所有功能于一身或外部使用,不混合。

我的猜测是,你必须设置一个PostBuildEvent在您的主要装配/工程(?)如果你在你的Foo.WebFoo.Web.Mvc项目生成一个或PreBuildEvent您的合并Foo将在您的Foo.WebFoo.Web.Mvc引用项目作为外部装配。

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

+0

是的,我试过这样做,但无法得到我期待的效果。看起来ILMerge需要在发布之前保留最后一步,而不是编译时。 – 2010-05-08 21:00:08

+0

我认为如果您的项目按照正确的顺序构建,就可以实现这一目标。您是否设置了项目依赖关系以确保构建顺序? – JoeBilly 2010-05-08 23:41:41

3

我知道我真的很晚才来到比赛,但我们正在努力解决这个完全相同的问题,这里是我们如何解决它。

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

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

这是上述概念的一个例子。一定要看看ProjectReference和Reference标签: https://github.com/joliver/EventStore/blob/5fce28b92fa875ea8acdfea387161abdee3c8b00/src/proj/EventStore.Persistence.RavenPersistence/EventStore.Persistence.RavenPersistence.csproj – 2011-01-07 17:01:10

相关问题