我希望我在这里找到一些简单的东西。我正在努力维护两个独立的项目
ProjectName.Core &
ProjectName.Infrastructure
这是在典型的洋葱架构中制作的,因此我可以松散地耦合我的服务并获得更大的灵活性。 Infrastructure项目引用Core项目。编译后,它们会生成这些DLL
ProjectName.Core.dll &
ProjectName.Infrastructure.dll
但是我希望它只生成1个dll。
ProjectName.Infrastructure.dll (or even ProjectName.dll)
我曾尝试使用ILMerge来执行此操作,但由于Infrastructure引用了Core,因此它会抛出异常,因为它无法找到Core dll。它显然不是在寻找自己。
现在我需要维护单独的项目,因为我有一些其他组合引用Core和另一个将连接在一起的项目,例如
ProjectName.Core &
ProjectName.DataAccess &
ProjectName.Web
编辑:我当前的解决方案使用Nant构建脚本调用ILMerge。它成功地合并在一起。但是当我尝试使用合并的DLL时,它会抛出异常,因为它无法找到核心库。
<target name="merge.core">
<property name="temp.dir" value="${build.dir}\Temp\"/>
<mkdir dir="${temp.dir}" if="${not directory::exists(temp.dir)}"/>
<property name="tools.dir" value=""${directory::get-current-directory()}\Tools\""/>
<exec program="Tools\ILMerge\ILMerge.exe" workingdir=".">
<arg value="/t:Library"/>
<arg value="/ndebug"/>
<arg value="/out:"${build.dir}\Temp\ProjectName.Infrastructure.dll""/>
<arg value=""${build.dir}ProjectName.Core.dll""/>
<arg value=""${build.dir}Xceed.Compression.dll""/>
<arg value=""${build.dir}ProjectName.Infrastructure.dll""/>
<arg value=""${build.dir}ProjectName.Infrastructure.XmlSerializers.dll""/>
</exec>
<delete file="${build.dir}ProjectName.Core.dll"/>
<delete file="${build.dir}Xceed.Compression.dll"/>
<delete file="${build.dir}ProjectName.Infrastructure.dll"/>
<delete file="${build.dir}ProjectName.Infrastructure.XmlSerializers.dll"/>
<move file="${build.dir}\Temp\ProjectName.Infrastructure.dll" tofile="${build.dir}ProjectName.Infrastructure.dll"/>
<delete dir="${temp.dir}" if="${directory::exists(temp.dir)}"/>
</target>
要更清楚一点。我可以使用Core库中的对象,但不能使用Infrastructure库。因为一旦它试图实例化其中一个对象,似乎.NET试图加载依赖,但无法找到它。
答案 0 :(得分:4)
使用ILMerge。它可以开箱即用。
答案 1 :(得分:2)
ILMerge!几乎和切片面包一样好。
http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx
答案 2 :(得分:1)
我知道在Visual Studio中不可能,但您可以将每个项目编译为netmodule,然后将它们作为DLL连接在一起。编译如下:
csc misource1.cs misource2.cs misource3.cs /target:module
然后与al.exe工具链接在一起,请参阅.netmodule Files as Linker Input和C# Assemblies。
答案 3 :(得分:0)
最新版本的ILMerge有一个/closed
选项,可用于合并程序集的传递闭包。它解决了这个确切的问题(请参阅ILMerge.doc用户手册中的2.6 Closed
和4.1 Input assembly not merged in correctly
部分。)
请注意,如果您的库尝试从命名的程序集动态加载对象,那么它将无法工作,因为合并的程序集名称与原始程序集名称不同。在这种情况下,ILMerge无法做任何事情;你必须修改你的依赖注入来解决这个问题。