【问题标题】:How to exclude an assembly from being packed into a PublishSingleFile app如何排除程序集被打包到 PublishSingleFile 应用程序中
【发布时间】:2021-07-16 04:24:34
【问题描述】:

.NET Core 和 .NET 5 具有 single file executable 功能。

如何排除托管程序集被打包到单个文件中?

示例:我可能希望app.exe 包括MyLib.A.dllMyLib.B.dll,但不包括MyLib.Special.dll。相反,我可能希望MyLib.Special.dll 驻留在app.exe 旁边的磁盘上并从那里加载。

(背景:MyLib.Special.dll 可能是在 L-GPL 下获得许可,但 app.exe 是专有的。)

【问题讨论】:

    标签: .net-core .net-5 .net-core-publishsinglefile


    【解决方案1】:

    您可以在 ProjectReference 元素中使用 ExcludeFromSingleFile 来防止程序集被嵌入,如下所示:

      <ItemGroup>
        <ProjectReference Include="MyLib.Special.csproj">
          <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
        </ProjectReference>
      </ItemGroup>
    

    【讨论】:

      【解决方案2】:

      由于以下原因,您的程序集名称 libxxx.dll 令人困惑:

      • 使用lib 命名的库符合 unix/linux 系统中的命名约定。但dll 仅在 Windows 中使用。有foo.dlllibfoo.so/libfoo.dylib

      • 使用 libfoo.sofoo.dll 命名的库意味着它们是本机程序集,但作为依赖项的本机程序集不会在 MSBuild 中自动处理,除非明确配置。 .NET 托管程序集的名称类似于 Foo.Bar.dll

      假设您在 LGPL 下获得许可的库是本机程序集,则单文件发布功能根本不包含它,因此您可能必须使用复制任务配置项目 MSBuild 文件以手动从项目中复制程序集文件文件夹到发布输出文件夹,其中必须包含此配置到prevent it from being bundled

      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
      

      【讨论】:

      • 我同意我为示例选择的程序集名称可能不是那么好 -> 已编辑。但是,感谢有关ExcludeFromSingleFile 的提示。我在考虑托管程序集,通常 (??) 使用 &lt;Reference&gt;&lt;PackageReference&gt; 引用。你知道如何让ExcludeFromSingleFile&lt;Reference&gt;&lt;PackageReference&gt; 一起工作吗?
      • 考虑像复制本机程序集一样复制程序集文件并动态加载程序集。如果您需要访问代码中的类型,请添加 ReferenceHintPath
      • 我无法让它工作:.NET 总是使用嵌入式程序集,而不是我手动加载的那个。
      • 如果你只通过HintPath引用程序集,我认为MSBuild不应该嵌入它。
      • 我做了一个&lt;Reference Include="..."&gt;&lt;HintPath&gt;...&lt;/HintPath&gt;&lt;/Reference&gt;,在代码中是一个Assembly.Load:它被嵌入并且我手动加载的程序集没有被使用。也许答案是“你不能”。
      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多