代码之家  ›  专栏  ›  技术社区  ›  Miguel Mesquita Alfaiate

将nuget包从项目绑定到DLL中,以允许在第三方项目中重用

  •  0
  • Miguel Mesquita Alfaiate  · 技术社区  · 1 年前

    让我试着解释一下这个场景:

    我有一个公共库项目,它是一个DLL项目。此DLL用于项目#1和项目#2,通过编译的DLL引用。

    公共库包括几个nuget包,包括Newtonsoft.Json和RestSharp。

    每当我将DLL添加到另一个项目中时,例如项目#1和#2,我都需要转到nuget并在每个项目中安装相同的两个包。

    我希望能够构建我的公共库dll,并让它“嵌入”nuget包,使其对客户端应用程序透明,在这种情况下是项目#1和#2,而不必显式地包含它们。

    我相信,如果我们有10个包含的包和5个消费者项目,并且我们需要更新包,那么这方面的复杂性是显而易见的。这相当痛苦,我不禁想知道可能有更好的方法来处理这件事。

    我更喜欢原生的,不必依赖外部工具来合并dll,或者如果可能的话,可以使用额外的nuget包。我在stackoverflow中发现了一些东西,包括: Include Nuget dependencies in my build output? 并且这个: Build NuGet Package automatically including referenced dependencies

    但这不是我想要的。

    这可能吗?

    澄清:编译的输出应该是一个单独的dll,包括我的代码和任何nuget包/dlls。为我的dll项目创建一个nuget包是可行的,作为最后的手段,如果我不能用一个dll来解决这个问题,我宁愿有多个单独的dll,而不必依赖外部工具来进行合并。

    0 回复  |  直到 1 年前
        1
  •  1
  •   Bowman Zhu    1 年前

    我想我可以重现这种情况:

    enter image description here

    你想把一些第三方软件包集成到一个dll中,你想把所有必要的东西都放在一个dll里,对吧?

    如果你想要这个,那么:

    1、如果你想要官方的原生方法来实现这一点, 答案是否定的。

    2、如果您使用第三方工具,那么 这是可以做到的。 但是 我非常不建议这样做。

    下面是一个详细的分步实现,我解释了这个想法是如何工作的,以及为什么我强烈反对它(我这边的例子是net6 dll):

    1'您需要一个工具来实现这一点:

    有一个名为 'ILRepack'

    Install命令:

    Install-Package ILRepack

    之后,您将能够在以下路径中找到ILRepack.exe文件:

    C:\Users\Administrator\.nuget\packages\ilrepack\2.0.18\tools

    将上述路径配置为机器的系统环境路径。

    2'准备所需的dll文件:

    例如,在我这边,它们是:

    Nuget_Bundle.dll(这是我的类库的dll,它使用了第三个Nuget包。)

    Newtonsoft.Json.dll

    RestSharp.dll

    打开一个新的命令提示符终端,然后转到存储上述dll文件的路径,然后运行命令:

    ilrepack /out:Merged.dll Nuget_Bundle.dll Newtonsoft.Json.dll RestSharp.dll

    之后,在同一目录中将有一个名为Merged.dll的dll文件。

    你可以在你想要的项目中这样引用这个dll文件:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <!-- Add dll file references here -->
      <ItemGroup>
        <Reference Include="C:\Users\Administrator\source\repos\process_attach\Nuget_Bundle\Merged.dll" />
      </ItemGroup>
    
    </Project>
    

    之后,您将能够运行/调试测试项目:

    enter image description here

    这确实是可能的,但我强烈反对,在这种情况下,可能会出现部分合并、版本不匹配、绑定重定向、内联等问题。此方法甚至可能导致VS IntelliSense出现问题。如果发生这种情况,将使您的开发体验非常糟糕。

    总之,本机方法无法实现合并dll的要求(或将包内容合并到dll)。你可以用第二种方法来实现这一点,但我不推荐。经典的依赖关系管理方法比这更成熟。