diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets
index 1d380c933585..93d4eb128d80 100644
--- a/dotnet/targets/Xamarin.Shared.Sdk.targets
+++ b/dotnet/targets/Xamarin.Shared.Sdk.targets
@@ -360,6 +360,7 @@
AOTCompiler=$(_AOTCompiler)
AOTOutputDirectory=$(_AOTOutputDirectory)
CacheDirectory=$(_LinkerCacheDirectory)
+ @(_BundlerDlsym -> 'Dlsym=%(Identity)')
Debug=$(_BundlerDebug)
DeploymentTarget=$(_MinimumOSVersion)
@(_BundlerEnvironmentVariables -> 'EnvironmentVariable=%(Identity)=%(Value)')
@@ -370,6 +371,8 @@
InvariantGlobalization=$(InvariantGlobalization)
ItemsDirectory=$(_LinkerItemsDirectory)
IsSimulatorBuild=$(_SdkIsSimulator)
+ LibMonoLinkMode=$(_LibMonoLinkMode)
+ LibXamarinLinkMode=$(_LibXamarinLinkMode)
LinkMode=$(_LinkMode)
MarshalManagedExceptionMode=$(_MarshalManagedExceptionMode)
MarshalObjectiveCExceptionMode=$(_MarshalObjectiveCExceptionMode)
@@ -557,9 +560,9 @@
-
-
-
+
+
+
@@ -630,6 +633,17 @@
+
+
+ <_RunAotCompiler>false
+
+ <_RunAotCompiler Condition="'$(_SdkIsSimulator)' != 'true' And '$(_PlatformName)' != 'macOS' And '$(_PlatformName)' != 'MacCatalyst'">true
+
+ <_RunAotCompiler Condition="'$(MtouchInterpreter)' != ''">true
+
+ <_RunAotCompiler Condition="'$(RuntimeIdentifier)' == 'maccatalyst-arm64'">true
+
+
<_IntermediateNativeLibraryDir>$(IntermediateOutputPath)nativelibraries/
<_NativeExecutableName>$(_AppBundleName)
@@ -642,11 +656,13 @@
<_AOTInputDirectory>$(_IntermediateNativeLibraryDir)aot-input/
<_AOTOutputDirectory>$(_IntermediateNativeLibraryDir)aot-output/
+ <_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And '$(_RunAotCompiler)' == 'true'">static
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And ('$(ComputedPlatform)' != 'iPhone' Or '$(_PlatformName)' == 'macOS')">dylib
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == ''">static
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'dylib'">dylib
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'static'">a
+ <_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(_RunAotCompiler)' == 'true'">static
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(ComputedPlatform)' != 'iPhone' And '$(_PlatformName)' != 'macOS'">dylib
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == ''">static
<_LibXamarinExtension Condition="'$(_LibXamarinLinkMode)' == 'dylib'">dylib
@@ -702,7 +718,7 @@
@@ -836,7 +852,7 @@
EntitlementsInExecutable="$(_CompiledEntitlements)"
FrameworkRPath="$(_EmbeddedFrameworksRPath)"
Frameworks="@(_NativeExecutableFrameworks);@(_BindingLibraryFrameworks)"
- LinkerFlags="@(_BindingLibraryLinkerFlags);@(_ReferencesLinkerFlags);@(_MainLinkerFlags)"
+ LinkerFlags="@(_AssemblyLinkerFlags);@(_ReferencesLinkerFlags);@(_MainLinkerFlags)"
LinkWithLibraries="@(_XamarinMainLibraries);@(_BindingLibraryLinkWith);@(_MainLinkWith)"
MinimumOSVersion="$(_MinimumOSVersion)"
NativeReferences="@(_FileNativeReference);@(_FrameworkNativeReference)"
diff --git a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/ParseBundlerArgumentsTaskBase.cs b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/ParseBundlerArgumentsTaskBase.cs
index bbd6bd9cb2d7..74b666cd6505 100644
--- a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/ParseBundlerArgumentsTaskBase.cs
+++ b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/ParseBundlerArgumentsTaskBase.cs
@@ -7,6 +7,9 @@ namespace Xamarin.MacDev.Tasks {
public abstract class ParseBundlerArgumentsTaskBase : XamarinTask {
public string ExtraArgs { get; set; }
+ [Output]
+ public ITaskItem [] DlSym { get; set; }
+
[Output]
public ITaskItem[] EnvironmentVariables { get; set; }
@@ -49,6 +52,7 @@ public override bool Execute ()
var args = CommandLineArgumentBuilder.Parse (ExtraArgs);
List xml = null;
var envVariables = new List ();
+ var dlsyms = new List ();
for (int i = 0; i < args.Length; i++) {
var arg = args [i];
@@ -84,6 +88,9 @@ public override bool Execute ()
// do not set the MtouchNoSymbolStrip property to 'true' in that case.
NoSymbolStrip = string.IsNullOrEmpty (value) ? "true" : "false";
break;
+ case "dlsym":
+ dlsyms.Add (new TaskItem (string.IsNullOrEmpty (value) ? "true" : value));
+ break;
case "dsym":
NoDSymUtil = ParseBool (value) ? "false" : "true";
break;
@@ -143,6 +150,11 @@ public override bool Execute ()
EnvironmentVariables = envVariables.ToArray ();
}
+ if (dlsyms.Count > 0) {
+ if (DlSym != null)
+ dlsyms.AddRange (DlSym);
+ DlSym = dlsyms.ToArray ();
+ }
}
return !Log.HasLoggedErrors;
diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets
index 2c3b8dea923b..70993a846784 100644
--- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets
+++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets
@@ -1016,6 +1016,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
NoDSymUtil="$(_NoDSymUtil)"
>
+
diff --git a/runtime/monotouch-main.m b/runtime/monotouch-main.m
index e10bb7d0f842..0475b4a005e2 100644
--- a/runtime/monotouch-main.m
+++ b/runtime/monotouch-main.m
@@ -426,12 +426,9 @@ - (void) memoryWarning: (NSNotification *) sender
xamarin_initialize ();
DEBUG_LAUNCH_TIME_PRINT ("\tmonotouch init time");
-#if defined (__arm__) || defined(__aarch64__)
- xamarin_register_assemblies ();
- assembly = xamarin_open_and_register (xamarin_executable_name, &exception_gchandle);
- if (exception_gchandle != NULL)
- xamarin_process_managed_exception_gchandle (exception_gchandle);
-#else
+ if (xamarin_register_assemblies != NULL)
+ xamarin_register_assemblies ();
+
if (xamarin_executable_name) {
assembly = xamarin_open_and_register (xamarin_executable_name, &exception_gchandle);
if (exception_gchandle != NULL)
@@ -455,7 +452,6 @@ - (void) memoryWarning: (NSNotification *) sender
if (exception_gchandle != NULL)
xamarin_process_managed_exception_gchandle (exception_gchandle);
}
-#endif
DEBUG_LAUNCH_TIME_PRINT ("\tAssembly register time");
diff --git a/runtime/monovm-bridge.m b/runtime/monovm-bridge.m
index 40e8adaf4b68..7fdce3cae2d6 100644
--- a/runtime/monovm-bridge.m
+++ b/runtime/monovm-bridge.m
@@ -57,9 +57,8 @@
void
xamarin_bridge_initialize ()
{
-#if defined (__arm__) || defined(__aarch64__)
- xamarin_register_modules ();
-#endif
+ if (xamarin_register_modules != NULL)
+ xamarin_register_modules ();
DEBUG_LAUNCH_TIME_PRINT ("\tAOT register time");
#ifdef DEBUG
diff --git a/runtime/runtime.m b/runtime/runtime.m
index ccbd684b8fa7..c81141413e8d 100644
--- a/runtime/runtime.m
+++ b/runtime/runtime.m
@@ -83,6 +83,7 @@
enum XamarinLaunchMode xamarin_launch_mode = XamarinLaunchModeApp;
bool xamarin_supports_dynamic_registration = true;
const char *xamarin_runtime_configuration_name = NULL;
+const char *xamarin_mono_native_lib_name = "__Internal";
/* Callbacks */
@@ -2441,8 +2442,25 @@ -(void) xamarinSetFlags: (enum XamarinGCHandleFlags) flags;
void* symbol = NULL;
+#if TARGET_OS_MACCATALYST
+ static void *monoNativeLibrary = NULL;
+#endif
+
if (!strcmp (libraryName, "__Internal")) {
symbol = dlsym (RTLD_DEFAULT, entrypointName);
+#if TARGET_OS_MACCATALYST
+ } else if (!strcmp (libraryName, "libSystem.Native") ||
+ !strcmp (libraryName, "libSystem.Security.Cryptography.Native.Apple") ||
+ !strcmp (libraryName, "libSystem.Net.Security.Native")) {
+ if (monoNativeLibrary == NULL) {
+ if (xamarin_mono_native_lib_name == NULL || !strcmp (xamarin_mono_native_lib_name, "__Internal")) {
+ monoNativeLibrary = RTLD_DEFAULT;
+ } else {
+ monoNativeLibrary = dlopen (xamarin_mono_native_lib_name, RTLD_LAZY);
+ }
+ }
+ symbol = dlsym (monoNativeLibrary, entrypointName);
+#endif // TARGET_OS_MACCATALYST
#if !defined (CORECLR_RUNTIME) // we're intercepting objc_msgSend calls using the managed System.Runtime.InteropServices.ObjectiveC.Bridge.SetMessageSendCallback instead.
#if defined (__i386__) || defined (__x86_64__) || defined (__arm64__)
} else if (!strcmp (libraryName, "/usr/lib/libobjc.dylib")) {
diff --git a/runtime/xamarin/main.h b/runtime/xamarin/main.h
index bf175a54b887..bf07699f6596 100644
--- a/runtime/xamarin/main.h
+++ b/runtime/xamarin/main.h
@@ -109,6 +109,7 @@ extern enum MarshalManagedExceptionMode xamarin_marshal_managed_exception_mode;
extern enum XamarinLaunchMode xamarin_launch_mode;
extern bool xamarin_supports_dynamic_registration;
extern const char *xamarin_runtime_configuration_name;
+extern const char *xamarin_mono_native_lib_name;
typedef void (*xamarin_setup_callback) ();
typedef int (*xamarin_extension_main_callback) (int argc, char** argv);
diff --git a/runtime/xamarin/runtime.h b/runtime/xamarin/runtime.h
index 86c702f5bcf0..24daad097a6e 100644
--- a/runtime/xamarin/runtime.h
+++ b/runtime/xamarin/runtime.h
@@ -328,9 +328,7 @@ void xamarin_mono_object_release_at_process_exit (MonoObject *mobj);
*/
MonoAssembly * xamarin_open_assembly (const char *name);
-#if defined(__arm__) || defined(__aarch64__)
void mono_aot_register_module (void *aot_info);
-#endif
typedef void (*xamarin_register_module_callback) ();
typedef void (*xamarin_register_assemblies_callback) ();
diff --git a/tests/dotnet/MyInterpretedApp/AppDelegate.cs b/tests/dotnet/MyInterpretedApp/AppDelegate.cs
index d7121c6f6036..c4477acb4ea5 100644
--- a/tests/dotnet/MyInterpretedApp/AppDelegate.cs
+++ b/tests/dotnet/MyInterpretedApp/AppDelegate.cs
@@ -3,7 +3,7 @@
using Foundation;
using UIKit;
-namespace MySingleView
+namespace MyInterpretedApp
{
public partial class AppDelegate : UIApplicationDelegate
{
@@ -15,7 +15,7 @@ public override bool FinishedLaunching (UIApplication app, NSDictionary options)
var dvc = new UIViewController ();
var button = new UIButton (window.Bounds);
- button.SetTitle ("net6!", UIControlState.Normal);
+ button.SetTitle ($"Execution mode: {Application.GetExecutionMode ()}", UIControlState.Normal);
dvc.Add (button);
window.RootViewController = dvc;
diff --git a/tests/dotnet/MyInterpretedApp/Entitlements.plist b/tests/dotnet/MyInterpretedApp/Entitlements.plist
deleted file mode 100644
index 5ea1ec76e117..000000000000
--- a/tests/dotnet/MyInterpretedApp/Entitlements.plist
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/tests/dotnet/MyInterpretedApp/Info.plist b/tests/dotnet/MyInterpretedApp/Info.plist
index 68032597c947..6631ffa6f242 100644
--- a/tests/dotnet/MyInterpretedApp/Info.plist
+++ b/tests/dotnet/MyInterpretedApp/Info.plist
@@ -2,25 +2,5 @@
- UIDeviceFamily
-
- 1
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- MinimumOSVersion
- 10.0
- CFBundleDisplayName
- ApplicationName
- CFBundleIdentifier
- com.xamarin.mysingleview
- XSAppIconAssets
- Resources/Images.xcassets/AppIcons.appiconset
- XSLaunchImageAssets
- Resources/Images.xcassets/LaunchImage.launchimage
diff --git a/tests/dotnet/MyInterpretedApp/MacCatalyst/Makefile b/tests/dotnet/MyInterpretedApp/MacCatalyst/Makefile
new file mode 100644
index 000000000000..110d078f4577
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/MacCatalyst/Makefile
@@ -0,0 +1 @@
+include ../shared.mk
diff --git a/tests/dotnet/MyInterpretedApp/MacCatalyst/MyInterpretedApp.csproj b/tests/dotnet/MyInterpretedApp/MacCatalyst/MyInterpretedApp.csproj
new file mode 100644
index 000000000000..8e66a9f43850
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/MacCatalyst/MyInterpretedApp.csproj
@@ -0,0 +1,8 @@
+
+
+
+ net6.0-maccatalyst
+ maccatalyst-arm64
+
+
+
diff --git a/tests/dotnet/MyInterpretedApp/Main.cs b/tests/dotnet/MyInterpretedApp/Main.cs
index 198707897413..326f775d06db 100644
--- a/tests/dotnet/MyInterpretedApp/Main.cs
+++ b/tests/dotnet/MyInterpretedApp/Main.cs
@@ -1,15 +1,26 @@
using System;
+using System.Runtime.CompilerServices;
using Foundation;
using UIKit;
-namespace MySingleView
+namespace MyInterpretedApp
{
public class Application
{
static void Main (string[] args)
{
+ Console.WriteLine ($"Execution mode: {GetExecutionMode ()}");
UIApplication.Main (args, null, typeof (AppDelegate));
}
+
+ public static string GetExecutionMode()
+ {
+ if (!RuntimeFeature.IsDynamicCodeSupported)
+ return "AOT";
+ if (RuntimeFeature.IsDynamicCodeCompiled)
+ return "JIT";
+ return "Interpreter";
+ }
}
}
diff --git a/tests/dotnet/MyInterpretedApp/Makefile b/tests/dotnet/MyInterpretedApp/Makefile
index e385064ec09e..84377bb70450 100644
--- a/tests/dotnet/MyInterpretedApp/Makefile
+++ b/tests/dotnet/MyInterpretedApp/Makefile
@@ -2,8 +2,12 @@ TOP=../../..
include $(TOP)/Make.config
-build:
- $(DOTNET6) build /bl *.csproj $(MSBUILD_VERBOSITY)
+%-ios:
+ $(MAKE) -C iOS $@
+
+%-tvos:
+ $(MAKE) -C tvOS $@
+
+%-maccatalyst %-maccat:
+ $(MAKE) -C MacCatalyst $@
-run:
- $(DOTNET6) build /bl *.csproj $(MSBUILD_VERBOSITY) -t:Run
diff --git a/tests/dotnet/MyInterpretedApp/iOS/Makefile b/tests/dotnet/MyInterpretedApp/iOS/Makefile
new file mode 100644
index 000000000000..f1a4290889e9
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/iOS/Makefile
@@ -0,0 +1,4 @@
+include ../shared.mk
+
+dev:
+ $(DOTNET6) build /bl *.csproj $(MSBUILD_VERBOSITY) /p:RuntimeIdentifier=ios-arm64
diff --git a/tests/dotnet/MyInterpretedApp/MyInterpretedApp.csproj b/tests/dotnet/MyInterpretedApp/iOS/MyInterpretedApp.csproj
similarity index 54%
rename from tests/dotnet/MyInterpretedApp/MyInterpretedApp.csproj
rename to tests/dotnet/MyInterpretedApp/iOS/MyInterpretedApp.csproj
index b1e5256cc14d..79efbc425b52 100644
--- a/tests/dotnet/MyInterpretedApp/MyInterpretedApp.csproj
+++ b/tests/dotnet/MyInterpretedApp/iOS/MyInterpretedApp.csproj
@@ -2,8 +2,6 @@
net6.0-ios
- iossimulator-x64
- Exe
- all
+
diff --git a/tests/dotnet/MyInterpretedApp/shared.csproj b/tests/dotnet/MyInterpretedApp/shared.csproj
new file mode 100644
index 000000000000..9048b403f527
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/shared.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Exe
+ true
+ true
+
+ MyInterpretedApp
+ com.xamarin.myinterpretedapp
+ 1.0
+
+
+
+
+
+ Info.plist
+
+
+
diff --git a/tests/dotnet/MyInterpretedApp/shared.mk b/tests/dotnet/MyInterpretedApp/shared.mk
new file mode 100644
index 000000000000..b1be5cd7a8ad
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/shared.mk
@@ -0,0 +1,23 @@
+TOP=../../../..
+include $(TOP)/Make.config
+
+reload:
+ rm -Rf $(TOP)/tests/dotnet/packages
+ $(MAKE) -C $(TOP) -j8 all
+ $(MAKE) -C $(TOP) -j8 install
+ git clean -xfdq
+
+reload-and-build: reload
+ $(MAKE) build
+
+reload-and-run: reload
+ $(MAKE) run
+
+build:
+ $(DOTNET6) build /bl *.csproj $(MSBUILD_VERBOSITY)
+
+run:
+ $(DOTNET6) build /bl *.csproj $(MSBUILD_VERBOSITY) -t:Run
+
+diag:
+ $(DOTNET6) build /v:diag msbuild.binlog
diff --git a/tests/dotnet/MyInterpretedApp/tvOS/Makefile b/tests/dotnet/MyInterpretedApp/tvOS/Makefile
new file mode 100644
index 000000000000..110d078f4577
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/tvOS/Makefile
@@ -0,0 +1 @@
+include ../shared.mk
diff --git a/tests/dotnet/MyInterpretedApp/tvOS/MyInterpretedApp.csproj b/tests/dotnet/MyInterpretedApp/tvOS/MyInterpretedApp.csproj
new file mode 100644
index 000000000000..efe9e8970530
--- /dev/null
+++ b/tests/dotnet/MyInterpretedApp/tvOS/MyInterpretedApp.csproj
@@ -0,0 +1,7 @@
+
+
+
+ net6.0-tvos
+
+
+
diff --git a/tests/monotouch-test/Metal/MTLDeviceTests.cs b/tests/monotouch-test/Metal/MTLDeviceTests.cs
index 0edb6b541d65..cea5c95a7591 100644
--- a/tests/monotouch-test/Metal/MTLDeviceTests.cs
+++ b/tests/monotouch-test/Metal/MTLDeviceTests.cs
@@ -63,6 +63,9 @@ static void FreePageAligned (IntPtr ptr, int length)
}
[Test]
+#if __MACCATALYST__
+ [Ignore ("This test requires a few test fixes that hasn't been backported to the release/6.0.1xx-preview7 branch - and won't be, since they're not necessary.")]
+#endif
public void ReturnReleaseTest ()
{
// This test tries to exercise all the Metal API that has a
@@ -97,7 +100,7 @@ public void ReturnReleaseTest ()
string metallib_path = Path.Combine (NSBundle.MainBundle.ResourcePath, "default.metallib");
string fragmentshader_path = Path.Combine (NSBundle.MainBundle.ResourcePath, "fragmentShader.metallib");
-#if !__MACOS__
+#if !__MACOS__ && !__MACCATALYST__
if (Runtime.Arch == Arch.SIMULATOR)
Assert.Ignore ("Metal isn't available in the simulator");
#endif
@@ -339,14 +342,16 @@ public void ReturnReleaseTest ()
}
}
- using (var library = device.CreateLibrary (fragmentshader_path, out var error))
- using (var func = library.CreateFunction ("fragmentShader2")) {
- using (var enc = func.CreateArgumentEncoder (0)) {
- Assert.IsNotNull (enc, "MTLFunction.CreateArgumentEncoder (nuint): NonNull");
- }
- using (var enc = func.CreateArgumentEncoder (0, out var reflection)) {
- Assert.IsNotNull (enc, "MTLFunction.CreateArgumentEncoder (nuint, MTLArgument): NonNull");
- Assert.IsNotNull (reflection, "MTLFunction.CreateArgumentEncoder (nuint, MTLArgument): NonNull reflection");
+ using (var library = device.CreateLibrary (fragmentshader_path, out var error)) {
+ Assert.IsNull (error, "MTLFunction.CreateArgumentEncoder: library creation failure");
+ using (var func = library.CreateFunction ("fragmentShader2")) {
+ using (var enc = func.CreateArgumentEncoder (0)) {
+ Assert.IsNotNull (enc, "MTLFunction.CreateArgumentEncoder (nuint): NonNull");
+ }
+ using (var enc = func.CreateArgumentEncoder (0, out var reflection)) {
+ Assert.IsNotNull (enc, "MTLFunction.CreateArgumentEncoder (nuint, MTLArgument): NonNull");
+ Assert.IsNotNull (reflection, "MTLFunction.CreateArgumentEncoder (nuint, MTLArgument): NonNull reflection");
+ }
}
}
@@ -378,7 +383,7 @@ public void ReturnReleaseTest ()
using (var hd = new MTLHeapDescriptor ()) {
hd.CpuCacheMode = MTLCpuCacheMode.DefaultCache;
-#if __MACOS__
+#if __MACOS__ || __MACCATALYST__
hd.StorageMode = MTLStorageMode.Private;
#else
hd.StorageMode = MTLStorageMode.Shared;
@@ -388,7 +393,7 @@ public void ReturnReleaseTest ()
hd.Size = sa.Size;
using (var heap = device.CreateHeap (hd)) {
-#if __MACOS__
+#if __MACOS__ || __MACCATALYST__
txt.StorageMode = MTLStorageMode.Private;
#endif
using (var texture = heap.CreateTexture (txt)) {
diff --git a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs
index c3f0f891990e..3bc836cd1f5d 100644
--- a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs
+++ b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs
@@ -426,13 +426,13 @@ public void RejectSslCertificatesServicePointManager (Type handlerType)
Assert.Inconclusive ("Request timedout.");
} else {
// the ServicePointManager.ServerCertificateValidationCallback will never be executed.
- Assert.False(invalidServicePointManagerCbWasExcuted);
- Assert.True(validationCbWasExecuted);
+ Assert.False (invalidServicePointManagerCbWasExcuted, "Invalid SPM executed");
+ Assert.True (validationCbWasExecuted, "Validation Callback called");
// assert the exception type
Assert.IsNotNull (ex, (result == null)? "Expected exception is missing and got no result" : $"Expected exception but got {result.Content.ReadAsStringAsync ().Result}");
- Assert.IsInstanceOf (typeof (HttpRequestException), ex);
- Assert.IsNotNull (ex.InnerException);
- Assert.IsInstanceOf (expectedExceptionType, ex.InnerException);
+ Assert.IsInstanceOf (typeof (HttpRequestException), ex, "Exception type");
+ Assert.IsNotNull (ex.InnerException, "InnerException");
+ Assert.IsInstanceOf (expectedExceptionType, ex.InnerException, "InnerException type");
}
}
diff --git a/tools/common/Application.cs b/tools/common/Application.cs
index dd83b7993c27..d7e6e967e7ec 100644
--- a/tools/common/Application.cs
+++ b/tools/common/Application.cs
@@ -182,8 +182,12 @@ public string FrameworksDirectory {
}
// How Mono should be embedded into the app.
+ AssemblyBuildTarget? libmono_link_mode;
public AssemblyBuildTarget LibMonoLinkMode {
get {
+ if (libmono_link_mode.HasValue)
+ return libmono_link_mode.Value;
+
if (Platform == ApplePlatform.MacOSX) {
// This property was implemented for iOS, but might be re-used for macOS if desired after testing to verify it works as expected.
throw ErrorHelper.CreateError (99, Errors.MX0099, "LibMonoLinkMode isn't a valid operation for macOS apps.");
@@ -199,11 +203,18 @@ public AssemblyBuildTarget LibMonoLinkMode {
return AssemblyBuildTarget.StaticObject;
}
}
+ set {
+ libmono_link_mode = value;
+ }
}
// How libxamarin should be embedded into the app.
+ AssemblyBuildTarget? libxamarin_link_mode;
public AssemblyBuildTarget LibXamarinLinkMode {
get {
+ if (libxamarin_link_mode.HasValue)
+ return libxamarin_link_mode.Value;
+
if (Platform == ApplePlatform.MacOSX) {
// This property was implemented for iOS, but might be re-used for macOS if desired after testing to verify it works as expected.
throw ErrorHelper.CreateError (99, Errors.MX0099, "LibXamarinLinkMode isn't a valid operation for macOS apps.");
@@ -219,14 +230,25 @@ public AssemblyBuildTarget LibXamarinLinkMode {
return AssemblyBuildTarget.StaticObject;
}
}
+ set {
+ libxamarin_link_mode = value;
+ }
}
// How the generated libpinvoke library should be linked into the app.
public AssemblyBuildTarget LibPInvokesLinkMode => LibXamarinLinkMode;
// How the profiler library should be linked into the app.
public AssemblyBuildTarget LibProfilerLinkMode => OnlyStaticLibraries ? AssemblyBuildTarget.StaticObject : AssemblyBuildTarget.DynamicLibrary;
+
// How the libmononative library should be linked into the app.
- public AssemblyBuildTarget LibMonoNativeLinkMode => HasDynamicLibraries ? AssemblyBuildTarget.DynamicLibrary : AssemblyBuildTarget.StaticObject;
+ public AssemblyBuildTarget LibMonoNativeLinkMode {
+ get {
+ // if there's a specific way libmono is being linked, use the same way.
+ if (libmono_link_mode.HasValue)
+ return libmono_link_mode.Value;
+ return HasDynamicLibraries ? AssemblyBuildTarget.DynamicLibrary: AssemblyBuildTarget.StaticObject;
+ }
+ }
// If all assemblies are compiled into static libraries.
public bool OnlyStaticLibraries {
@@ -1350,8 +1372,10 @@ public bool IsInterpreted (string assembly)
if (Platform == ApplePlatform.MacOSX)
throw ErrorHelper.CreateError (99, Errors.MX0099, "IsInterpreted isn't a valid operation for macOS apps.");
+#if !NET
if (IsSimulatorBuild)
return false;
+#endif
// IsAOTCompiled and IsInterpreted are not opposites: mscorlib.dll can be both.
if (!UseInterpreter)
@@ -1381,15 +1405,18 @@ public bool IsInterpreted (string assembly)
public bool IsAOTCompiled (string assembly)
{
#if NET
- if (Platform == ApplePlatform.MacOSX || Platform == ApplePlatform.MacCatalyst)
+ if (Platform == ApplePlatform.MacOSX)
return false; // AOT on .NET for macOS hasn't been implemented yet.
#else
if (Platform == ApplePlatform.MacOSX)
throw ErrorHelper.CreateError (99, Errors.MX0099, "IsAOTCompiled isn't a valid operation for macOS apps.");
#endif
+ if (!UseInterpreter) {
+ if (Platform == ApplePlatform.MacCatalyst)
+ return IsArchEnabled (Abi.ARM64);
- if (!UseInterpreter)
- return true;
+ return IsDeviceBuild;
+ }
// IsAOTCompiled and IsInterpreted are not opposites: mscorlib.dll can be both:
// - mscorlib will always be processed by the AOT compiler to generate required wrapper functions for the interpreter to work
@@ -1593,8 +1620,10 @@ public bool UseDlsym (string assembly)
return !Profile.IsSdkAssembly (Path.GetFileNameWithoutExtension (assembly));
case ApplePlatform.TVOS:
case ApplePlatform.WatchOS:
- case ApplePlatform.MacCatalyst:
return false;
+ case ApplePlatform.MacCatalyst:
+ // We can't emit a direct call to the P/Invoke with the AOT compiler: https://github.com/dotnet/runtime/issues/55733
+ return IsAOTCompiled (assembly);
default:
throw ErrorHelper.CreateError (71, Errors.MX0071, Platform, ProductName);
}
diff --git a/tools/common/Target.cs b/tools/common/Target.cs
index e41680b46fb0..abc38ab55fcb 100644
--- a/tools/common/Target.cs
+++ b/tools/common/Target.cs
@@ -668,12 +668,12 @@ void GenerateIOSMain (StringWriter sw, Abi abi)
foreach (var s in assemblies) {
if (!s.IsAOTCompiled)
continue;
- if ((abi & Abi.SimulatorArchMask) == 0) {
- var info = s.AssemblyDefinition.Name.Name;
- info = EncodeAotSymbol (info);
- assembly_externs.Append ("extern void *mono_aot_module_").Append (info).AppendLine ("_info;");
- assembly_aot_modules.Append ("\tmono_aot_register_module (mono_aot_module_").Append (info).AppendLine ("_info);");
- }
+
+ var info = s.AssemblyDefinition.Name.Name;
+ info = EncodeAotSymbol (info);
+ assembly_externs.Append ("extern void *mono_aot_module_").Append (info).AppendLine ("_info;");
+ assembly_aot_modules.Append ("\tmono_aot_register_module (mono_aot_module_").Append (info).AppendLine ("_info);");
+
string sname = s.FileName;
if (assembly_name != sname && IsBoundAssembly (s)) {
register_assemblies.Append ("\txamarin_open_and_register (\"").Append (sname).Append ("\", &exception_gchandle);").AppendLine ();
@@ -681,22 +681,20 @@ void GenerateIOSMain (StringWriter sw, Abi abi)
}
}
- if ((abi & Abi.SimulatorArchMask) == 0 || app.Embeddinator) {
- var frameworks = assemblies.Where ((a) => a.BuildTarget == AssemblyBuildTarget.Framework)
- .OrderBy ((a) => a.Identity, StringComparer.Ordinal);
- foreach (var asm_fw in frameworks) {
- var asm_name = asm_fw.Identity;
- if (asm_fw.BuildTargetName == asm_name)
- continue; // this is deduceable
- var prefix = string.Empty;
- if (!app.HasFrameworksDirectory && asm_fw.IsCodeShared)
- prefix = "../../";
- var suffix = string.Empty;
- if (app.IsSimulatorBuild)
- suffix = "/simulator";
- assembly_location.AppendFormat ("\t{{ \"{0}\", \"{2}Frameworks/{1}.framework/MonoBundle{3}\" }},\n", asm_name, asm_fw.BuildTargetName, prefix, suffix);
- assembly_location_count++;
- }
+ var frameworks = assemblies.Where ((a) => a.BuildTarget == AssemblyBuildTarget.Framework)
+ .OrderBy ((a) => a.Identity, StringComparer.Ordinal);
+ foreach (var asm_fw in frameworks) {
+ var asm_name = asm_fw.Identity;
+ if (asm_fw.BuildTargetName == asm_name)
+ continue; // this is deduceable
+ var prefix = string.Empty;
+ if (!app.HasFrameworksDirectory && asm_fw.IsCodeShared)
+ prefix = "../../";
+ var suffix = string.Empty;
+ if (app.IsSimulatorBuild)
+ suffix = "/simulator";
+ assembly_location.AppendFormat ("\t{{ \"{0}\", \"{2}Frameworks/{1}.framework/MonoBundle{3}\" }},\n", asm_name, asm_fw.BuildTargetName, prefix, suffix);
+ assembly_location_count++;
}
sw.WriteLine ("#include \"xamarin/xamarin.h\"");
@@ -762,8 +760,11 @@ void GenerateIOSMain (StringWriter sw, Abi abi)
sw.WriteLine ("\tmono_ee_interp_init (NULL);");
#endif
sw.WriteLine ("\tmono_jit_set_aot_mode (MONO_AOT_MODE_INTERP);");
- } else if (app.IsDeviceBuild)
+ } else if (app.IsDeviceBuild) {
sw.WriteLine ("\tmono_jit_set_aot_mode (MONO_AOT_MODE_FULL);");
+ } else if (app.Platform == ApplePlatform.MacCatalyst && ((abi & Abi.ARM64) == Abi.ARM64)) {
+ sw.WriteLine ("\tmono_jit_set_aot_mode (MONO_AOT_MODE_FULL);");
+ }
if (assembly_location.Length > 0)
sw.WriteLine ("\txamarin_set_assembly_directories (&assembly_locations);");
@@ -779,12 +780,12 @@ void GenerateIOSMain (StringWriter sw, Abi abi)
#else
var addDllMap = true;
#endif
+ string mono_native_lib;
+ if (app.LibMonoNativeLinkMode == AssemblyBuildTarget.StaticObject || Driver.IsDotNet)
+ mono_native_lib = "__Internal";
+ else
+ mono_native_lib = app.GetLibNativeName () + ".dylib";
if (addDllMap) {
- string mono_native_lib;
- if (app.LibMonoNativeLinkMode == AssemblyBuildTarget.StaticObject)
- mono_native_lib = "__Internal";
- else
- mono_native_lib = app.GetLibNativeName () + ".dylib";
sw.WriteLine ();
#if NET
sw.WriteLine ($"\tmono_dllmap_insert (NULL, \"libSystem.Native\", NULL, \"{mono_native_lib}\", NULL);");
@@ -796,6 +797,8 @@ void GenerateIOSMain (StringWriter sw, Abi abi)
sw.WriteLine ($"\tmono_dllmap_insert (NULL, \"System.Net.Security.Native\", NULL, \"{mono_native_lib}\", NULL);");
#endif
sw.WriteLine ();
+ } else {
+ sw.WriteLine ($"\txamarin_mono_native_lib_name = \"{mono_native_lib}\";");
}
}
diff --git a/tools/dotnet-linker/LinkerConfiguration.cs b/tools/dotnet-linker/LinkerConfiguration.cs
index 10088548622b..f12e19d6e837 100644
--- a/tools/dotnet-linker/LinkerConfiguration.cs
+++ b/tools/dotnet-linker/LinkerConfiguration.cs
@@ -16,6 +16,8 @@
namespace Xamarin.Linker {
public class LinkerConfiguration {
+ string LinkerFile;
+
public List Abis;
public string AOTCompiler;
public string AOTOutputDirectory;
@@ -74,6 +76,8 @@ public static LinkerConfiguration GetInstance (LinkContext context, bool createI
if (!File.Exists (linker_file))
throw new FileNotFoundException ($"The custom linker file {linker_file} does not exist.");
+ LinkerFile = linker_file;
+
Profile = new BaseProfile (this);
DerivedLinkContext = new DerivedLinkContext { LinkerConfiguration = this, };
Application = new Application (this);
@@ -122,6 +126,9 @@ public static LinkerConfiguration GetInstance (LinkContext context, bool createI
throw new InvalidOperationException ($"Unable to parse the {key} value: {value} in {linker_file}");
DeploymentTarget = deployment_target;
break;
+ case "Dlsym":
+ Application.ParseDlsymOptions (value);
+ break;
case "EnvironmentVariable":
var separators = new char [] { ':', '=' };
var equals = value.IndexOfAny (separators);
@@ -145,6 +152,12 @@ public static LinkerConfiguration GetInstance (LinkContext context, bool createI
case "IsSimulatorBuild":
IsSimulatorBuild = string.Equals ("true", value, StringComparison.OrdinalIgnoreCase);
break;
+ case "LibMonoLinkMode":
+ Application.LibMonoLinkMode = ParseLinkMode (value, key);
+ break;
+ case "LibXamarinLinkMode":
+ Application.LibXamarinLinkMode = ParseLinkMode (value, key);
+ break;
case "LinkMode":
if (!Enum.TryParse (value, true, out var lm))
throw new InvalidOperationException ($"Unable to parse the {key} value: {value} in {linker_file}");
@@ -298,6 +311,17 @@ public static LinkerConfiguration GetInstance (LinkContext context, bool createI
Application.Initialize ();
}
+ AssemblyBuildTarget ParseLinkMode (string value, string variableName)
+ {
+ if (string.Equals (value, "dylib", StringComparison.OrdinalIgnoreCase)) {
+ return AssemblyBuildTarget.DynamicLibrary;
+ } else if (string.Equals (value, "static", StringComparison.OrdinalIgnoreCase)) {
+ return AssemblyBuildTarget.StaticObject;
+ }
+
+ throw new InvalidOperationException ($"Invalid {variableName} '{value}' in {LinkerFile}");
+ }
+
public void Write ()
{
if (Verbosity > 0) {
@@ -307,6 +331,7 @@ public void Write ()
Console.WriteLine ($" AssemblyName: {Application.AssemblyName}");
Console.WriteLine ($" CacheDirectory: {CacheDirectory}");
Console.WriteLine ($" Debug: {Application.EnableDebug}");
+ Console.WriteLine ($" Dlsym: {Application.DlsymOptions} {(Application.DlsymAssemblies != null ? string.Join (" ", Application.DlsymAssemblies.Select (v => (v.Item2 ? "+" : "-") + v.Item1)) : string.Empty)}");
Console.WriteLine ($" DeploymentTarget: {DeploymentTarget}");
Console.WriteLine ($" IntermediateLinkDir: {IntermediateLinkDir}");
Console.WriteLine ($" InterpretedAssemblies: {string.Join (", ", Application.InterpretedAssemblies)}");
diff --git a/tools/dotnet-linker/Steps/ComputeNativeBuildFlagsStep.cs b/tools/dotnet-linker/Steps/ComputeNativeBuildFlagsStep.cs
index bec18ab4af30..9aa1e1920472 100644
--- a/tools/dotnet-linker/Steps/ComputeNativeBuildFlagsStep.cs
+++ b/tools/dotnet-linker/Steps/ComputeNativeBuildFlagsStep.cs
@@ -27,6 +27,23 @@ protected override void TryEndProcess ()
}
Configuration.WriteOutputForMSBuild ("_LinkerFrameworks", linkerFrameworks);
+
+ // Tell MSBuild about any additional linker flags we found
+ var linkerFlags = new List ();
+ foreach (var asm in Configuration.Target.Assemblies) {
+ if (asm.LinkerFlags == null)
+ continue;
+ foreach (var arg in asm.LinkerFlags) {
+ var item = new MSBuildItem {
+ Include = arg,
+ Metadata = new Dictionary {
+ { "Assembly", asm.Identity },
+ },
+ };
+ linkerFlags.Add (item);
+ }
+ }
+ Configuration.WriteOutputForMSBuild ("_AssemblyLinkerFlags", linkerFlags);
}
}
}
diff --git a/tools/dotnet-linker/Steps/ExtractBindingLibrariesStep.cs b/tools/dotnet-linker/Steps/ExtractBindingLibrariesStep.cs
index 709efaeab633..044226f61b57 100644
--- a/tools/dotnet-linker/Steps/ExtractBindingLibrariesStep.cs
+++ b/tools/dotnet-linker/Steps/ExtractBindingLibrariesStep.cs
@@ -55,23 +55,6 @@ protected override void TryEndProcess ()
}
}
Configuration.WriteOutputForMSBuild ("_BindingLibraryFrameworks", frameworks);
-
- // Tell MSBuild about any additional linker flags we found
- var linkerFlags = new List ();
- foreach (var asm in Configuration.Target.Assemblies) {
- if (asm.LinkerFlags == null)
- continue;
- foreach (var arg in asm.LinkerFlags) {
- var item = new MSBuildItem {
- Include = arg,
- Metadata = new Dictionary {
- { "Assembly", asm.Identity },
- },
- };
- linkerFlags.Add (item);
- }
- }
- Configuration.WriteOutputForMSBuild ("_BindingLibraryLinkerFlags", linkerFlags);
}
}
}
diff --git a/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs b/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs
index 105afae92bd6..d01071a85c49 100644
--- a/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs
+++ b/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs
@@ -146,7 +146,7 @@ void ProcessMethod (MethodDefinition method)
case "System.Security.Cryptography.Native.Apple":
#if NET
// https://github.com/dotnet/runtime/issues/47533
- if (DerivedLinkContext.App.Platform != ApplePlatform.MacOSX) {
+ if (DerivedLinkContext.App.Platform != ApplePlatform.MacOSX && DerivedLinkContext.App.Platform != ApplePlatform.MacCatalyst) {
Driver.Log (4, "Did not add native reference to {0} in {1} referenced by {2} in {3}.", pinfo.EntryPoint, pinfo.Module.Name, method.FullName, method.Module.Name);
break;
}