如何排除程序集被打包到 PublishSingleFile 应用程序中

How to exclude an assembly from being packed into a PublishSingleFile app

.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 是专有的。)

您的程序集名称 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>

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

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