首页 > 解决方案 > SingleFile 的 dotnet publish 不包含 .dylib 文件

问题描述

我对 C# 很陌生,在 MacOS Big Sur 上,我首先尝试了 VisualStudio 上提出的“Hello World”。我试图通过这样做使单个文件可执行:

$ dotnet publish -r osx.11.0-x64 -p:PublishSingleFile=true

Microsoft (R) Build Engine version 16.10.2+857e5a733 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  Hello -> /Users/elapouya/projects/csharp/Hello/Hello/bin/Debug/net5.0/osx.11.0-x64/Hello.dll
  Hello -> /Users/elapouya/projects/csharp/Hello/Hello/bin/Debug/net5.0/osx.11.0-x64/publish/

它工作正常:

$ /Users/elapouya/projects/csharp/Hello/Hello/bin/Debug/net5.0/osx.11.0-x64/publish/Hello
Hello World !!

但是为了确保它是一个包含所有内容的独立可执行文件,我只是将它复制到另一个目录中并运行它但它失败了:

$ cd ~/tmp
~/tmp$ cp /Users/elapouya/projects/csharp/Hello/Hello/bin/Debug/net5.0/osx.11.0-x64/publish/Hello .
~/tmp$ ./Hello
Error:
  An assembly specified in the application dependencies manifest (Hello.deps.json) was not found:
    package: 'runtimepack.Microsoft.NETCore.App.Runtime.osx-x64', version: '5.0.8'
    path: 'libSystem.IO.Compression.Native.dylib'

如果我查看使用生成的文件,dotnet publish我可以看到:

drwxr-xr-x   11 elapouya  staff       352  9 aoû 11:29 .
drwxr-xr-x  192 elapouya  staff      6144  9 aoû 11:03 ..
-rwxr-xr-x    1 elapouya  staff  52687111  9 aoû 11:36 Hello
-rw-r--r--    1 elapouya  staff      9676  9 aoû 11:36 Hello.pdb
-rwxr--r--    1 elapouya  staff    917392 15 jui 21:05 libSystem.IO.Compression.Native.dylib
-rwxr--r--    1 elapouya  staff     70380 15 jui 21:05 libSystem.Native.dylib
-rwxr--r--    1 elapouya  staff     15704 15 jui 21:05 libSystem.Net.Security.Native.dylib
-rwxr--r--    1 elapouya  staff     51588 15 jui 21:05 libSystem.Security.Cryptography.Native.Apple.dylib
-rwxr--r--    1 elapouya  staff    159472 15 jui 21:05 libSystem.Security.Cryptography.Native.OpenSsl.dylib
-rwxr--r--    1 elapouya  staff   2624360 15 jui 21:05 libclrjit.dylib
-rwxr--r--    1 elapouya  staff   6958844 15 jui 21:07 libcoreclr.dylib

这里有很多.dylib,包括程序执行时发生的错误~/tmp

.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <RuntimeIdentifiers>osx.11.0-x64</RuntimeIdentifiers>
    <SelfContained>true</SelfContained>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

</Project>

dotnet --info

DK .NET (reflétant tous les fichiers global.json) :
 Version:   5.0.302
 Commit:    c005824e35

Environnement d'exécution :
 OS Name:     Mac OS X
 OS Version:  11.0
 OS Platform: Darwin
 RID:         osx.11.0-x64
 Base Path:   /usr/local/share/dotnet/sdk/5.0.302/

Host (useful for support):
  Version: 5.0.8
  Commit:  35964c9215

.NET SDKs installed:
  3.1.411 [/usr/local/share/dotnet/sdk]
  5.0.302 [/usr/local/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 3.1.17 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.8 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.17 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.8 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

我应该怎么做才能拥有可以在任何 osx 11.0 上的任何位置运行的单个文件可执行文件?

标签: c#macos

解决方案


现在它可以工作了:最终.csproj拥有一个最小大小的多合一可执行文件是:


  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
    <PublishTrimmed>true</PublishTrimmed>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

</Project>

推荐阅读