加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 如何维护两个单独的项目,但将它们合并为一个DLL?

发布时间:2020-12-14 01:36:17 所属栏目:Windows 来源:网络整理
导读:我希望我能在这里找到一些简单的东西.我正在努力维护两个独立的项目 ProjectName.Core ProjectName.Infrastructure 这是在典型的洋葱架构中进行的,因此我可以松散地耦合我的服务并获得更大的灵活性. Infrastructure项目引用Core项目.编译后,它们会生成这些DL
我希望我能在这里找到一些简单的东西.我正在努力维护两个独立的项目

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时,它会引发异常,因为它无法找到Core库.

<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="&quot;${directory::get-current-directory()}Tools&;quot;"/>
    <exec program="ToolsILMergeILMerge.exe" workingdir=".">
      <arg value="/t:Library"/>
      <arg value="/ndebug"/>      
      <arg value="/out:&quot;${build.dir}TempProjectName.Infrastructure.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Core.dll&quot;"/>
      <arg value="&quot;${build.dir}Xceed.Compression.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Infrastructure.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Infrastructure.XmlSerializers.dll&quot;"/>
    </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}TempProjectName.Infrastructure.dll" tofile="${build.dir}ProjectName.Infrastructure.dll"/>
    <delete dir="${temp.dir}" if="${directory::exists(temp.dir)}"/>
  </target>

要更清楚一点.我可以使用Core库中的对象,但不能使用Infrastructure库.因为一旦它试图实例化其中一个对象,似乎.NET试图加载依赖,但无法找到它.

解决方法

使用 ILMerge.它开箱即用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读