xamarin / xamarin-macios

.NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C#
Other
2.42k stars 507 forks source link

Custom NSView won't work if referenced only in storyboard (not referenced in the C#-code) #20605

Closed snechaev closed 1 month ago

snechaev commented 1 month ago

Steps to Reproduce

  1. Build and run the project attached
  2. Observe the light blue rectangle in the main window (it's a custom NSView with a background color)
  3. Open the AppDelegate.cs and comment out the line MyView test;
  4. Rebuild and run the project, check the main window's content.

Expected Behavior

Nothing has changed, the light blue rectangle is still there because we only commented a declaration without any instantiation or anything else meaningful.

Actual Behavior

The light blue rectangle is missing.

Environment

Version information ``` Visual Studio Professional 2022 for Mac Version 17.6.12 (build 410) Installation UUID: 0fad0ecd-571d-44d3-a344-3945a9ce46fb Runtime .NET 7.0.3 (64-bit) Architecture: X64 Microsoft.macOS.Sdk 13.1.1007; git-rev-head:8afca776a0a96613dfb7200e0917bb57f9ed5583; git-branch:release/7.0.1xx-xcode14.2 Roslyn (Language Service) 4.6.0-3.23180.6+99e956e42697a6dd886d1e12478ea2b27cceacfa NuGet Version: 6.4.0.117 .NET SDK (x64) SDK: /usr/local/share/dotnet/sdk/7.0.316/Sdks SDK Versions: 8.0.204 7.0.316 7.0.315 7.0.314 7.0.313 7.0.310 7.0.309 7.0.308 7.0.307 7.0.306 7.0.304 7.0.302 6.0.422 6.0.421 6.0.420 6.0.419 6.0.416 6.0.415 6.0.414 6.0.413 6.0.412 6.0.410 6.0.408 MSBuild SDKs: /Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/Sdks .NET Runtime (x64) Runtime: /usr/local/share/dotnet/dotnet Runtime Versions: 8.0.4 7.0.19 7.0.18 7.0.17 7.0.16 7.0.13 7.0.12 7.0.11 7.0.10 7.0.9 7.0.7 7.0.5 6.0.30 6.0.29 6.0.28 6.0.27 6.0.24 6.0.23 6.0.22 6.0.21 6.0.20 6.0.18 6.0.16 Xamarin.Profiler Version: 1.8.0.49 Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler Updater Version: 11 Apple Developer Tools Xcode: 15.2 22503 Build: 15C500b Xamarin.Mac Version: 9.3.0.23 Visual Studio Professional Hash: 9defd91b3 Branch: xcode14.3 Build date: 2023-10-23 16:14:59-0400 Xamarin.iOS Version: 16.4.0.23 Visual Studio Professional Hash: 9defd91b3 Branch: xcode14.3 Build date: 2023-10-23 16:15:00-0400 Xamarin Designer Version: 17.6.3.9 Hash: 2648399ae8 Branch: remotes/origin/d17-6 Build date: 2024-05-08 22:24:17 UTC Xamarin.Android Version: 13.2.2.0 (Visual Studio Professional) Commit: xamarin-android/d17-5/45b0e14 Android SDK: /Users/sergey/Library/Developer/Xamarin/android-sdk-macosx Supported Android versions: 12.0 (API level 31) 13.0 (API level 33) SDK Command-line Tools Version: 7.0 SDK Platform Tools Version: 33.0.3 SDK Build Tools Version: 32.0.0 Build Information: Mono: d9a6e87 Java.Interop: xamarin/java.interop/d17-5@149d70fe SQLite: xamarin/sqlite/3.40.1@68c69d8 Xamarin.Android Tools: xamarin/xamarin-android-tools/d17-5@ca1552d Microsoft Build of OpenJDK Java SDK: /Library/Java/JavaVirtualMachines/microsoft-11.jdk 11.0.16.1 Android Designer EPL code available here: https://github.com/xamarin/AndroidDesigner.EPL Eclipse Temurin JDK Java SDK: /Library/Java/JavaVirtualMachines/temurin-8.jdk 1.8.0.302 Android Designer EPL code available here: https://github.com/xamarin/AndroidDesigner.EPL Android SDK Manager Version: 17.6.0.50 Hash: a715dca Branch: HEAD Build date: 2024-05-08 22:24:22 UTC Android Device Manager Version: 0.0.0.1309 Hash: 06e3e77 Branch: HEAD Build date: 2024-05-08 22:24:22 UTC Build Information Release ID: 1706120410 Git revision: 2f8e0518dd80a933901821bac53f7398d4b61c0f Build date: 2024-05-08 22:22:37+00 Build branch: release-17.6 Build lane: release-17.6 Operating System Mac OS X 14.4.1 Darwin 23.4.0 Darwin Kernel Version 23.4.0 Fri Mar 15 00:11:05 PDT 2024 root:xnu-10063.101.17~1/RELEASE_X86_64 x86_64 ```

Build Logs

msbuild.binlog.zip

Example Project (If Possible)

UiFromClassLib.zip

Additional information

snechaev commented 1 month ago

Additional note - it is not necessary to reference the exact the view class in the code to make it work. It is sufficient to reference any type from the class library.

For example, I added the new empty class called UnrelatedClassLibClass in the class library then referenced this class without instantiation in the AppDelegate - UnrelatedClassLibClass test1; - and the MyView works now.

So, it looks like it is not a Xamarin problem, but some kind of general build system feature. However, in very specific Xamarin use cases, such a feature can cause strange behavior for the Xamarin apps.

rolfbjarne commented 1 month ago

Thanks a lot for the report!

The problem is that if you don't reference any managed code from the class library in your executable, the C# compiler won't add a reference to the class library into the main executable (which makes sense - why would the executable reference the class library if it's not used?).

And when deciding which assemblies to add in the app bundle, we start with the main executable assembly, and recursively find all the referenced assemblies (we don't include every assembly referenced by the executable project, because that would make all apps incredibly huge).

In theory we could:

There are a few of downsides:

So, since:

I don't foresee we'll decide to fix this, so I'm closing this issue.

snechaev commented 1 month ago

Thank you very much for your detailed explanation! I totally agree that it's a very rare edge case and I'm glad to see that even though it won't be fixed, there is now some sort of searchable explanation of what's going on and how it can be workarounded. Thanks again for this explanation and for all your work in general.