Skip to content

Commit 597e716

Browse files
[installer] extra copy of libMonoPosixHelper.dylib for libZipSharp.dll (#5471)
Context: https://github.com/jonathanpeppers/foo/blob/Microsoft.NET.Sdk/foo.csproj I've been experimenting with trying to multi-target "legacy" Xamarin.Android and .NET 6 with: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>monoandroid11.0;net6.0-android</TargetFrameworks> </PropertyGroup> </Project> I got this to work fairly well on Windows with some hacks, but it completely fails on macOS: error XACML7000: System.DllNotFoundException: Unable to load shared library 'MonoPosixHelper' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libMonoPosixHelper, 1): image not found error XACML7000: at Mono.Unix.Native.Syscall.lstat(String file_name, Stat& buf) error XACML7000: at Xamarin.Tools.Zip.Utilities.StatFile(String path, Boolean followSymlinks, Stat& sbuf) in /Users/runner/work/1/s/Utilities.Unix.cs:line 58 error XACML7000: at Xamarin.Tools.Zip.Utilities.GetFileType(String path, Boolean followSymlinks, FilePermissions& fileType) in /Users/runner/work/1/s/Utilities.Unix.cs:line 147 error XACML7000: at Xamarin.Tools.Zip.UnixPlatformServices.IsFileOfType(String path, FilePermissions mode, Boolean& result) in /Users/runner/work/1/s/UnixPlatformServices.cs:line 428 error XACML7000: at Xamarin.Tools.Zip.UnixPlatformServices.IsDirectory(ZipArchive archive, String path, Boolean& result) in /Users/runner/work/1/s/UnixPlatformServices.cs:line 40 error XACML7000: at Xamarin.Tools.Zip.PlatformServices.<>c__DisplayClass9_0.<IsDirectory>b__0(IPlatformServices services) in /Users/runner/work/1/s/PlatformServices.cs:line 73 error XACML7000: at Xamarin.Tools.Zip.PlatformServices.CallServices(Func`2 code) in /Users/runner/work/1/s/PlatformServices.cs:line 165 error XACML7000: at Xamarin.Tools.Zip.PlatformServices.IsDirectory(ZipArchive archive, String path) in /Users/runner/work/1/s/PlatformServices.cs:line 73 error XACML7000: at Xamarin.Tools.Zip.ZipArchive.AddFile(String sourcePath, String archivePath, EntryPermissions permissions, CompressionMethod compressionMethod, Boolean overwriteExisting) in /Users/runner/work/1/s/ZipArchive.cs:line 397 error XACML7000: at Xamarin.Android.Tasks.ZipArchiveEx.AddFiles(String folder, String folderInArchive, CompressionMethod method) error XACML7000: at Xamarin.Android.Tasks.ZipArchiveEx.AddDirectory(String folder, String folderInArchive, CompressionMethod method) error XACML7000: at Xamarin.Android.Tasks.CreateManagedLibraryResourceArchive.<>c__DisplayClass39_0.<RunTask>b__0(String f) error XACML7000: at Xamarin.Android.Tools.Files.ArchiveZipUpdate(String target, Action`1 archiver) error XACML7000: at Xamarin.Android.Tasks.CreateManagedLibraryResourceArchive.RunTask() error XACML7000: at Xamarin.Android.Tasks.AndroidTask.Execute() Comparing a regular .NET 6 build, it works because `libMonoPosixHelper.dylib` is sitting right next to `libZipSharp.dll`. Comparing a regular "legacy" Xamarin.Android build, it works because `libMonoPosixHelper.dylib` is loaded via: Mono: DllImport loaded library '/Library/Frameworks/Mono.framework/Versions/6.12.0/lib/../lib/libMonoPosixHelper.dylib' We're *lucky* this works, as it is using a Mono system `libMonoPosixHelper.dylib` instead of the one from Xamarin.Android. I could solve the problem locally by running: cd /Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xbuild/Xamarin/Android/lib/host-Darwin/ sudo cp libMonoPosixHelper.dylib ../../ I updated our installer to include the copy of `libMonoPosixHelper.dylib` that `libZipSharp.dll` expects.
1 parent 16e0aa2 commit 597e716

File tree

3 files changed

+8
-11
lines changed

3 files changed

+8
-11
lines changed

build-tools/create-packs/Microsoft.Android.Sdk.proj

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ core workload sdk packs imported by Microsoft.NET.Workload.Android.
2121
<IncludeMonoBundleComponents>false</IncludeMonoBundleComponents>
2222
</PropertyGroup>
2323

24-
<ItemGroup>
25-
<PackageReference Include="Mono.Posix.NETStandard" Version="5.20.1-preview" GeneratePathProperty="true" PrivateAssets="all" />
26-
</ItemGroup>
27-
2824
<PropertyGroup>
2925
<BeforePack>
3026
_GenerateXASdkContent;
@@ -49,16 +45,9 @@ core workload sdk packs imported by Microsoft.NET.Workload.Android.
4945
<AndroidSdkBuildTools Include="@(_MSBuildFilesWin)" Condition=" '$(AndroidHostRID)' == 'win-x64' ">
5046
<RelativePath>$([MSBuild]::MakeRelative($(MSBuildSrcDir), %(FullPath)))</RelativePath>
5147
</AndroidSdkBuildTools>
52-
<!-- Exclude host-os specific native libraries, aside from libMonoPosixHelper.dylib which is required by LibZipSharp on macOS. -->
5348
<AndroidSdkBuildTools Include="@(_MSBuildFilesUnix);@(_MSBuildFilesUnixSign);@(_MSBuildFilesUnixSignAndHarden)" Condition=" '$(AndroidHostRID)' == 'linux-x64' or '$(AndroidHostRID)' == 'osx-x64' ">
5449
<RelativePath>$([MSBuild]::MakeRelative($(MSBuildSrcDir), %(FullPath)))</RelativePath>
5550
</AndroidSdkBuildTools>
56-
<AndroidSdkBuildTools Include="$(PkgMono_Posix_NETStandard)\runtimes\osx\native\libMonoPosixHelper.dylib" Condition=" '$(AndroidHostRID)' == 'osx-x64' ">
57-
<RelativePath>libMonoPosixHelper.dylib</RelativePath>
58-
</AndroidSdkBuildTools>
59-
<AndroidSdkBuildTools Include="$(PkgMono_Posix_NETStandard)\runtimes\linux-x64\native\libMonoPosixHelper.so" Condition=" '$(AndroidHostRID)' == 'linux-x64' " >
60-
<RelativePath>libMonoPosixHelper.so</RelativePath>
61-
</AndroidSdkBuildTools>
6251
<!-- Remove items with '%(ExcludeFromAndroidNETSdk)' == 'true' metadata -->
6352
<AndroidSdkBuildTools Remove="@(AndroidSdkBuildTools)" Condition=" '%(AndroidSdkBuildTools.ExcludeFromAndroidNETSdk)' == 'true' " />
6453
</ItemGroup>

build-tools/installers/create-installers.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@
360360
<_MSBuildFilesUnixSign Include="$(MSBuildSrcDir)\lib\host-$(HostOS)\libxamarin-app.$(LibExtension)" ExcludeFromAndroidNETSdk="true" />
361361
<_MSBuildFilesUnixSign Include="$(MSBuildSrcDir)\lib\host-$(HostOS)\libxa-internal-api.$(LibExtension)" ExcludeFromAndroidNETSdk="true" />
362362
<_MSBuildFilesUnixSign Include="$(MSBuildSrcDir)\libzip.$(LibExtension)" />
363+
<!-- A second libMonoPosixHelper.dylib is needed for libZipSharp.dll to load -->
364+
<_MSBuildFilesUnixSign Include="$(MSBuildSrcDir)\libMonoPosixHelper.$(LibExtension)" />
363365
<_MSBuildFilesUnix Include="$(MSBuildSrcDir)\proguard\bin\proguard.sh" />
364366
</ItemGroup>
365367
<!-- Allow us to exclude mono bundle files for PR builds -->

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,12 @@
367367
<None Include="startup-xf.aotprofile">
368368
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
369369
</None>
370+
<None Include="$(PkgMono_Posix_NETStandard)\runtimes\osx\native\libMonoPosixHelper.dylib">
371+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
372+
</None>
373+
<None Include="$(PkgMono_Posix_NETStandard)\runtimes\linux-x64\native\libMonoPosixHelper.so">
374+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
375+
</None>
370376
</ItemGroup>
371377

372378
<ItemGroup>

0 commit comments

Comments
 (0)