diff --git a/Agents/Xamarin.Interactive.Android/AndroidAgent.cs b/Agents/Xamarin.Interactive.Android/AndroidAgent.cs index b79461ecf..05d948541 100644 --- a/Agents/Xamarin.Interactive.Android/AndroidAgent.cs +++ b/Agents/Xamarin.Interactive.Android/AndroidAgent.cs @@ -36,7 +36,6 @@ class AndroidAgent : Agent, IViewHierarchyHandler AG.Point displaySize; int contentId; - string deviceIpAddress; public IActivityTracker ActivityTracker { get; set; } internal int ContentId => contentId; diff --git a/Agents/Xamarin.Interactive.Android/InspectorSupport.cs b/Agents/Xamarin.Interactive.Android/InspectorSupport.cs index c48b0e290..a583dede2 100644 --- a/Agents/Xamarin.Interactive.Android/InspectorSupport.cs +++ b/Agents/Xamarin.Interactive.Android/InspectorSupport.cs @@ -5,6 +5,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; +using System.Runtime.CompilerServices; using System.Threading; using Android.App; @@ -14,13 +16,14 @@ namespace Xamarin { - public static partial class InspectorSupport + public static class InspectorSupport { static readonly SynchronizationContext mainContext = Application.SynchronizationContext; static Timer timer; static readonly ActivityTrackerWrapper activityTracker = new ActivityTrackerWrapper (); + static Agent agent; - static partial void CreateAgent (AgentStartOptions startOptions) + static void CreateAgent (AgentStartOptions startOptions) { mainContext.Post ( s => { @@ -44,5 +47,32 @@ internal static void StartBreakdance () 1000, Timeout.Infinite); } + + static void Start () + { + try { + CreateAgent (new AgentStartOptions { + AgentStarted = AgentStarted, + }); + } catch (Exception e) { + Console.Error.WriteLine (e); + } + } + + internal static void Stop () + { + agent?.Dispose (); + agent = null; + } + + [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + static void BreakdanceStep () + { + } + + [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + internal static void AgentStarted (string agentConnectUri) + { + } } } diff --git a/Agents/Xamarin.Interactive.Android/Xamarin.Interactive.Android.csproj b/Agents/Xamarin.Interactive.Android/Xamarin.Interactive.Android.csproj index 31efb6036..424c1a255 100644 --- a/Agents/Xamarin.Interactive.Android/Xamarin.Interactive.Android.csproj +++ b/Agents/Xamarin.Interactive.Android/Xamarin.Interactive.Android.csproj @@ -69,8 +69,6 @@ Xamarin.Interactive - - diff --git a/Agents/Xamarin.Interactive.Console/Xamarin.Interactive.Console.csproj b/Agents/Xamarin.Interactive.Console/Xamarin.Interactive.Console.csproj index 2549156dc..6950f79a1 100644 --- a/Agents/Xamarin.Interactive.Console/Xamarin.Interactive.Console.csproj +++ b/Agents/Xamarin.Interactive.Console/Xamarin.Interactive.Console.csproj @@ -9,8 +9,7 @@ Xamarin.Interactive.Console Xamarin.Interactive.Console v4.6.1 - - False + true true @@ -55,11 +54,6 @@ Xamarin.Interactive - - - - - diff --git a/Agents/Xamarin.Interactive.DotNetCore/Xamarin.Interactive.DotNetCore.csproj b/Agents/Xamarin.Interactive.DotNetCore/Xamarin.Interactive.DotNetCore.csproj index b85fff9b7..61bf112a3 100644 --- a/Agents/Xamarin.Interactive.DotNetCore/Xamarin.Interactive.DotNetCore.csproj +++ b/Agents/Xamarin.Interactive.DotNetCore/Xamarin.Interactive.DotNetCore.csproj @@ -6,7 +6,7 @@ - + \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Facades/Facades.cs b/Agents/Xamarin.Interactive.Facades/Facades.cs deleted file mode 100644 index 666b2d807..000000000 --- a/Agents/Xamarin.Interactive.Facades/Facades.cs +++ /dev/null @@ -1,16 +0,0 @@ -// -// Author: -// Aaron Bockover -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace System -{ - [AttributeUsage ( - AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, - Inherited = false)] - sealed class SerializableAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Facades/Xamarin.Interactive.Facades.csproj b/Agents/Xamarin.Interactive.Facades/Xamarin.Interactive.Facades.csproj deleted file mode 100644 index 894e0057d..000000000 --- a/Agents/Xamarin.Interactive.Facades/Xamarin.Interactive.Facades.csproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C} - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - Library - Xamarin.Interactive.Facades - Xamarin.Interactive.Facades - v4.5 - Profile111 - - - true - full - false - bin\Debug - DEBUG;PCL_FACADE_ASSEMBLY - prompt - 4 - - - true - bin\Release - PCL_FACADE_ASSEMBLY - prompt - 4 - pdbonly - true - - - - - - - \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsAgentIntegration.cs b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsAgentIntegration.cs index f55ed40af..f91b8791c 100644 --- a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsAgentIntegration.cs +++ b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsAgentIntegration.cs @@ -87,7 +87,7 @@ void ResetStateHandler () { var activity = realAgent.ActivityTracker?.StartedActivities?.FirstOrDefault (); var formsView = Xamarin.Forms.Application.Current.MainPage; - var nativeViewGroup = Platform.GetRenderer (formsView).ViewGroup; + var nativeViewGroup = Platform.GetRenderer (formsView).View; var parentToRestore = (ViewGroup) nativeViewGroup.Parent; while (parentToRestore.Parent != null) diff --git a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsInspectView.cs b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsInspectView.cs index 02e172613..879f638d4 100644 --- a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsInspectView.cs +++ b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsInspectView.cs @@ -118,7 +118,7 @@ public AndroidFormsInspectView (Page page, bool useNativeViewBounds = false, boo PopulateTypeInformationFromObject (page); // TODO: Pull the ClassId or some user-set property as the description? - var nativeView = Platform.GetRenderer (page).ViewGroup; + var nativeView = Platform.GetRenderer (page).View; if (!useNativeViewBounds) { Transform = XIVR.GetViewTransform (nativeView); if (Transform == null) { @@ -169,7 +169,7 @@ public AndroidFormsInspectView (Element element, bool withSubviews = true) var velement = element as VisualElement; if (velement != null) { - var nativeView = Platform.GetRenderer (velement).ViewGroup; + var nativeView = Platform.GetRenderer (velement).View; DisplayName = element.GetType ().Name; try { @@ -206,7 +206,7 @@ protected override void UpdateCapturedImage () // If the VisualElement is a view and is not a layout, snapshot its children, // as we've reached the leaf of the tree. Otherwise, skip children. var skipChildren = !(ve is View && !(ve is Layout)); - var nativeView = Platform.GetRenderer (ve).ViewGroup; + var nativeView = Platform.GetRenderer (ve).View; if (nativeView != null) CapturedImage = XIVR.RenderAsPng (nativeView, skipChildren); } diff --git a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsViewHierarchyHandler.cs b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsViewHierarchyHandler.cs index da6571fb7..50204ad2d 100644 --- a/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsViewHierarchyHandler.cs +++ b/Agents/Xamarin.Interactive.Forms.Android/AndroidFormsViewHierarchyHandler.cs @@ -30,7 +30,7 @@ public AndroidFormsViewHierarchyHandler (AndroidAgent agent) Rectangle GetNativeViewBounds (VisualElement visualElement) { - var nativeView = Platform.GetRenderer (visualElement).ViewGroup; + var nativeView = Platform.GetRenderer (visualElement).View; var location = new int [2]; nativeView.GetLocationOnScreen (location); @@ -54,7 +54,7 @@ void ResetHighlightOnView () void DrawHighlightOnView (VisualElement element) { - var view = Platform.GetRenderer (element).ViewGroup; + var view = Platform.GetRenderer (element).View; highlightedView = view; highlightedViewOriginalBackground = highlightedView.Background; diff --git a/Agents/Xamarin.Interactive.Forms.Android/Xamarin.Interactive.Forms.Android.csproj b/Agents/Xamarin.Interactive.Forms.Android/Xamarin.Interactive.Forms.Android.csproj index 8e0699f38..5b975a1cd 100644 --- a/Agents/Xamarin.Interactive.Forms.Android/Xamarin.Interactive.Forms.Android.csproj +++ b/Agents/Xamarin.Interactive.Forms.Android/Xamarin.Interactive.Forms.Android.csproj @@ -49,7 +49,7 @@ - 2.3.4.231 + 2.4.0.38779 diff --git a/Agents/Xamarin.Interactive.Forms.iOS/Xamarin.Interactive.Forms.iOS.csproj b/Agents/Xamarin.Interactive.Forms.iOS/Xamarin.Interactive.Forms.iOS.csproj index c2b25d551..cbc8fcc0b 100644 --- a/Agents/Xamarin.Interactive.Forms.iOS/Xamarin.Interactive.Forms.iOS.csproj +++ b/Agents/Xamarin.Interactive.Forms.iOS/Xamarin.Interactive.Forms.iOS.csproj @@ -50,7 +50,7 @@ - 2.3.4.231 + 2.4.0.38779 diff --git a/Agents/Xamarin.Interactive.Forms/Xamarin.Interactive.Forms.csproj b/Agents/Xamarin.Interactive.Forms/Xamarin.Interactive.Forms.csproj index 1b8db5f4a..c4bf5875b 100644 --- a/Agents/Xamarin.Interactive.Forms/Xamarin.Interactive.Forms.csproj +++ b/Agents/Xamarin.Interactive.Forms/Xamarin.Interactive.Forms.csproj @@ -1,59 +1,15 @@ - - + - Debug - AnyCPU - 8.0.30703 - {932D2C61-5DBE-4D82-A4D6-1EA7401F10D3} - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - Library - Xamarin.Interactive.Forms - Xamarin.Interactive.Forms - v4.5 - Profile111 - - + netstandard2.0 - - true - portable - false - bin\Debug - DEBUG; - prompt - 4 - true - - - true - bin\Release - prompt - 4 - true - portable - true - - - - - - - - 2.3.4.231 - - + - - - + + - - {955F473A-04EC-4716-B75E-509BA892499B} - Xamarin.Interactive - + - + \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Mac.Desktop/Xamarin.Interactive.Mac.Desktop.csproj b/Agents/Xamarin.Interactive.Mac.Desktop/Xamarin.Interactive.Mac.Desktop.csproj index f77d61550..6fd194853 100644 --- a/Agents/Xamarin.Interactive.Mac.Desktop/Xamarin.Interactive.Mac.Desktop.csproj +++ b/Agents/Xamarin.Interactive.Mac.Desktop/Xamarin.Interactive.Mac.Desktop.csproj @@ -52,8 +52,6 @@ - - diff --git a/Agents/Xamarin.Interactive.Mac.Mobile/Xamarin.Interactive.Mac.Mobile.csproj b/Agents/Xamarin.Interactive.Mac.Mobile/Xamarin.Interactive.Mac.Mobile.csproj index 5d4310c65..0083f14bc 100644 --- a/Agents/Xamarin.Interactive.Mac.Mobile/Xamarin.Interactive.Mac.Mobile.csproj +++ b/Agents/Xamarin.Interactive.Mac.Mobile/Xamarin.Interactive.Mac.Mobile.csproj @@ -52,8 +52,6 @@ - - diff --git a/Agents/Xamarin.Interactive.Mac/MacAgent.cs b/Agents/Xamarin.Interactive.Mac/MacAgent.cs index 4f0327179..a756f20d6 100644 --- a/Agents/Xamarin.Interactive.Mac/MacAgent.cs +++ b/Agents/Xamarin.Interactive.Mac/MacAgent.cs @@ -23,6 +23,7 @@ using Xamarin.Interactive.Inspection; using Xamarin.Interactive.Logging; using Xamarin.Interactive.Remote; +using Xamarin.Interactive.Unified; namespace Xamarin.Interactive.Mac { @@ -51,6 +52,7 @@ public MacAgent () NSBundle.MainBundle.InfoDictionary ["CFBundleName"] as NSString); RepresentationManager.AddProvider (new MacRepresentationProvider ()); + new UnifiedNativeHelper ().Initialize (); ViewHierarchyHandlerManager.AddViewHierarchyHandler ("AppKit", this); } diff --git a/Agents/Xamarin.Interactive/NativeExceptionHandler.cs b/Agents/Xamarin.Interactive.Mac/NativeExceptionHandler.cs similarity index 88% rename from Agents/Xamarin.Interactive/NativeExceptionHandler.cs rename to Agents/Xamarin.Interactive.Mac/NativeExceptionHandler.cs index fc6768a6e..901011a0a 100644 --- a/Agents/Xamarin.Interactive/NativeExceptionHandler.cs +++ b/Agents/Xamarin.Interactive.Mac/NativeExceptionHandler.cs @@ -7,17 +7,12 @@ // Licensed under the MIT License. using System; - -#if IOS || MAC - using System.Runtime.InteropServices; using ObjCRuntime; using Foundation; -#endif - -namespace Xamarin.Interactive +namespace Xamarin.Interactive.Unified { static class NativeExceptionHandler { @@ -28,18 +23,15 @@ struct Disposable : IDisposable public class TrappedNativeException : Exception { -#if IOS || MAC public NSException NativeException { get; } - public TrappedNativeException (NSException realException) : - base ($"A native exception was thrown: {realException.Description}") + public TrappedNativeException (NSException realException) : + base ($"A native exception was thrown: {realException.Description}") { NativeException = realException; } -#endif } -#if IOS || MAC [DllImport (Constants.ObjectiveCLibrary)] static extern IntPtr objc_setExceptionPreprocessor (IntPtr handler); @@ -73,13 +65,5 @@ public static void Release () originalHandler = IntPtr.Zero; } } -#else - public static IDisposable Trap () - => new Disposable (); - - public static void Release () - { - } -#endif } } \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Mac/UnifiedInspectorSupport.cs b/Agents/Xamarin.Interactive.Mac/UnifiedInspectorSupport.cs index 12cfa7dda..77ee35c68 100644 --- a/Agents/Xamarin.Interactive.Mac/UnifiedInspectorSupport.cs +++ b/Agents/Xamarin.Interactive.Mac/UnifiedInspectorSupport.cs @@ -7,9 +7,8 @@ // Licensed under the MIT License. using System; -using System.Linq; -using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using Xamarin.Interactive; using Xamarin.Interactive.Core; @@ -22,23 +21,12 @@ namespace Xamarin { - // WARNING: this type must not _directly_ reference any type in the PCL! - // Doing so will break live inspection since this type implements the - // PCL loading (so _directly_ referencing a type in the PCL will cause - // the debugger to fail to load the type because the loader cannot load) - public static partial class InspectorSupport + public static class InspectorSupport { - #if IOS - const string netProfilesPath = "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono"; - #elif MAC - const string netProfilesPath = "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/mono"; - #endif - - static bool environmentDetected; - static AssemblyName pclInteractiveAssemblyName; - static string fxPath; - static IntPtr breakdanceTimerSource; + static Agent agent; + + internal static Action AgentStartedHandler; internal static void StartBreakdance () { @@ -54,12 +42,10 @@ static void StopBreakdance () } } - static partial void CreateAgent (AgentStartOptions startOptions) + static void CreateAgent (AgentStartOptions startOptions) { StopBreakdance (); - AppDomain.CurrentDomain.AssemblyResolve += HandleAssemblyResolve; - var source = IntPtr.Zero; source = Dispatch.ScheduleRepeatingTimer (TimeSpan.FromSeconds (0), userdata => { Dispatch.Cancel (source); @@ -67,52 +53,35 @@ static partial void CreateAgent (AgentStartOptions startOptions) }); } - static void DetectEnvironment () + static void Start () { - if (environmentDetected) - return; - - environmentDetected = true; - - var runningCorlibVersion = typeof (object).Assembly.GetName ().Version; - - foreach (var profilePath in new DirectoryInfo (netProfilesPath).EnumerateDirectories ()) { - var corlibPath = Path.Combine (profilePath.FullName, "mscorlib.dll"); - if (File.Exists (corlibPath) && - AssemblyName.GetAssemblyName (corlibPath)?.Version == runningCorlibVersion) { - fxPath = profilePath.FullName; - break; - } + try { + CreateAgent (new AgentStartOptions { + AgentStarted = AgentStarted, + }); + } catch (Exception e) { + Console.Error.WriteLine (e); } - - pclInteractiveAssemblyName = Assembly - .GetExecutingAssembly () - .GetReferencedAssemblies () - .FirstOrDefault (a => a.Name == "Xamarin.Interactive"); } - static Assembly HandleAssemblyResolve (object sender, ResolveEventArgs e) + internal static void Stop () { - DetectEnvironment (); - - if (pclInteractiveAssemblyName == null || !Directory.Exists (fxPath)) - return null; - - var requestingAssemblyName = e.RequestingAssembly?.GetName (); - - if (requestingAssemblyName?.FullName != pclInteractiveAssemblyName.FullName) - return null; - - var assemblyFileName = new AssemblyName (e.Name).Name + ".dll"; + agent?.Dispose (); + agent = null; + } - var assemblyPath = Path.Combine (fxPath, assemblyFileName); - if (!File.Exists (assemblyPath)) { - assemblyPath = Path.Combine (fxPath, "Facades", assemblyFileName); - if (!File.Exists (assemblyPath)) - return null; - } + [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + static void BreakdanceStep () + { + } - return Assembly.LoadFrom (assemblyPath); + [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + internal static void AgentStarted (string agentConnectUri) + { + // This handler is only ever used by the inspector support test. + // In normal use, the Inspector extension retrieves the URI by + // setting a breakpoint on the AgentStarted method. + AgentStartedHandler?.Invoke (agentConnectUri); } } } \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Mac/UnifiedNativeHelper.cs b/Agents/Xamarin.Interactive.Mac/UnifiedNativeHelper.cs new file mode 100644 index 000000000..dbe342d16 --- /dev/null +++ b/Agents/Xamarin.Interactive.Mac/UnifiedNativeHelper.cs @@ -0,0 +1,49 @@ +// +// Author: +// Aaron Bockover +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Reflection; + +using ObjCRuntime; +using Foundation; + +using Xamarin.Interactive.Representations.Reflection; + +namespace Xamarin.Interactive.Unified +{ + sealed class UnifiedNativeHelper : NativeHelper + { + public override IDisposable TrapNativeExceptions () => NativeExceptionHandler.Trap (); + + public override string CheckProperty ( + PropertyInfo property, + object target, + RepresentedType declaringType) + { + if (!typeof (NSObject).IsAssignableFrom (declaringType.ResolvedType)) + return null; + + var selName = property + ?.GetGetMethod (true) + ?.GetCustomAttribute () + ?.Selector; + if (selName == null) + return null; + + var objCSelector = new Selector (selName); + if (objCSelector == null || objCSelector.Handle == IntPtr.Zero) + return null; + + var nso = target as NSObject; + if (nso == null || nso.RespondsToSelector (objCSelector)) + return null; + + return string.Format ("{0} instance 0x{1:x} does not respond to selector {2}", + target.GetType (), nso.Handle, objCSelector.Name); + } + } +} \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Mac/Xamarin.Interactive.Mac.projitems b/Agents/Xamarin.Interactive.Mac/Xamarin.Interactive.Mac.projitems index 8de99e6fa..f833a570c 100644 --- a/Agents/Xamarin.Interactive.Mac/Xamarin.Interactive.Mac.projitems +++ b/Agents/Xamarin.Interactive.Mac/Xamarin.Interactive.Mac.projitems @@ -19,5 +19,7 @@ + + \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.NetStandard/Xamarin.Interactive.NetStandard.csproj b/Agents/Xamarin.Interactive.NetStandard/Xamarin.Interactive.NetStandard.csproj deleted file mode 100644 index 06faa1b2d..000000000 --- a/Agents/Xamarin.Interactive.NetStandard/Xamarin.Interactive.NetStandard.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - netstandard2.0 - Xamarin.Interactive - Xamarin.Interactive - True - True - - - true - - - true - - - - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono-cil-strip - ..\..\Tools\ILFixer\ILFixer.csproj - $(OutputPath)$(AssemblyName).dll - $(OutputPath)ref\$(AssemblyName).dll - $(OutputPath)ref-$(AssemblyName).dll - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.Wpf/InspectorSupport.cs b/Agents/Xamarin.Interactive.Wpf/InspectorSupport.cs index c804b9fd4..c72932398 100644 --- a/Agents/Xamarin.Interactive.Wpf/InspectorSupport.cs +++ b/Agents/Xamarin.Interactive.Wpf/InspectorSupport.cs @@ -15,21 +15,19 @@ namespace Xamarin { - public static partial class InspectorSupport + public static class InspectorSupport { + static Agent agent; static string connectionInfoPipeHandle; - static partial void CreateAgent (AgentStartOptions startOptions) - { - // NOTE: This needs to be called from the main thread - agent = new WpfAgent ().Start (startOptions); - } - public static void Start (string connectionInfoPipeHandle) { InspectorSupport.connectionInfoPipeHandle = connectionInfoPipeHandle; - Start (); + // NOTE: This needs to be called from the main thread + agent = new WpfAgent ().Start (new AgentStartOptions { + AgentStarted = AgentStarted, + }); } internal static void AgentStarted (string agentConnectUri) diff --git a/Agents/Xamarin.Interactive.Wpf/Xamarin.Interactive.Wpf.csproj b/Agents/Xamarin.Interactive.Wpf/Xamarin.Interactive.Wpf.csproj index 92cfe0865..a28c210d0 100644 --- a/Agents/Xamarin.Interactive.Wpf/Xamarin.Interactive.Wpf.csproj +++ b/Agents/Xamarin.Interactive.Wpf/Xamarin.Interactive.Wpf.csproj @@ -53,17 +53,15 @@ + + + {955f473a-04ec-4716-b75e-509ba892499b} Xamarin.Interactive - - - - - \ No newline at end of file diff --git a/Agents/Xamarin.Interactive.iOS/Xamarin.Interactive.iOS.csproj b/Agents/Xamarin.Interactive.iOS/Xamarin.Interactive.iOS.csproj index 00b92eef7..83f427623 100644 --- a/Agents/Xamarin.Interactive.iOS/Xamarin.Interactive.iOS.csproj +++ b/Agents/Xamarin.Interactive.iOS/Xamarin.Interactive.iOS.csproj @@ -43,8 +43,6 @@ - - @@ -56,6 +54,12 @@ UnifiedExtensions.cs + + UnifiedNativeHelper.cs + + + NativeExceptionHandler.cs + UnifiedEvaluationContextGlobalObject.cs diff --git a/Agents/Xamarin.Interactive.iOS/iOSAgent.cs b/Agents/Xamarin.Interactive.iOS/iOSAgent.cs index d46fda4f0..a2f1f5eab 100644 --- a/Agents/Xamarin.Interactive.iOS/iOSAgent.cs +++ b/Agents/Xamarin.Interactive.iOS/iOSAgent.cs @@ -22,6 +22,7 @@ using Xamarin.Interactive.Core; using Xamarin.Interactive.Inspection; using Xamarin.Interactive.Remote; +using Xamarin.Interactive.Unified; namespace Xamarin.Interactive.iOS { @@ -39,6 +40,7 @@ public iOSAgent () screenHeight: (int)UIScreen.MainScreen.Bounds.Height); RepresentationManager.AddProvider (new iOSRepresentationProvider ()); + new UnifiedNativeHelper ().Initialize (); ViewHierarchyHandlerManager.AddViewHierarchyHandler ("UIKit", this); } diff --git a/Agents/Xamarin.Interactive/API/Xamarin.Interactive.api.cs b/Agents/Xamarin.Interactive/API/Xamarin.Interactive.api.cs index ba85cba61..7bd4a8658 100644 --- a/Agents/Xamarin.Interactive/API/Xamarin.Interactive.api.cs +++ b/Agents/Xamarin.Interactive/API/Xamarin.Interactive.api.cs @@ -1,4 +1,7 @@ +[assembly: AssemblyConfiguration ("Release")] [assembly: AssemblyCopyright ("Copyright 2016-2017 Microsoft. All rights reserved.\nCopyright 2014-2016 Xamarin Inc. All rights reserved.")] +[assembly: AssemblyProduct ("Xamarin.Interactive")] +[assembly: AssemblyTitle ("Xamarin.Interactive")] [assembly: InternalsVisibleTo ("Xamarin.Interactive.DotNetCore")] [assembly: InternalsVisibleTo ("Xamarin.Interactive.Android")] [assembly: InternalsVisibleTo ("Xamarin.Interactive.iOS")] @@ -30,7 +33,7 @@ [assembly: InternalsVisibleTo ("Xamarin.Workbooks.Client.Android")] [assembly: InternalsVisibleTo ("Xamarin.Interactive.XS")] [assembly: InternalsVisibleTo ("Xamarin.Interactive.VS")] -[assembly: TargetFramework (".NETPortable,Version=v4.5,Profile=Profile111", FrameworkDisplayName = ".NET Portable Subset")] +[assembly: TargetFramework (".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: BuildInfo] namespace Xamarin.Interactive { @@ -87,6 +90,24 @@ public interface IAgentSynchronizationContext SynchronizationContext PushContext (SynchronizationContext context); } + [EditorBrowsable (EditorBrowsableState.Never)] + public static class InteractiveCulture + { + [EditorBrowsable (EditorBrowsableState.Never)] + public static CultureInfo CurrentCulture { + get; + set; + } + + [EditorBrowsable (EditorBrowsableState.Never)] + public static CultureInfo CurrentUICulture { + get; + set; + } + + [EditorBrowsable (EditorBrowsableState.Never)] + public static void Initialize (); + } } namespace Xamarin.Interactive.CodeAnalysis { @@ -105,6 +126,56 @@ public struct CodeCellId : IEquatable public override string ToString (); } + public class EvaluationContextGlobalObject + { + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Clear all previous REPL results", ShowReturnType = false, LiveInspectOnly = true)] + public static readonly Guid clear; + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Get or set the current thread culture")] + public static CultureInfo CurrentCulture { + get; + set; + } + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Get or set the current thread culture by name")] + public static string CurrentCultureName { + get; + set; + } + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "This help text", ShowReturnType = false)] + public object help { + get; + } + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Direct public access to the agent powering the interactive session")] + public IAgent InteractiveAgent { + get; + } + + [EditorBrowsable (EditorBrowsableState.Never)] + public T __AssignmentMonitor (T value, string symbolName, string nodeType, int spanStart, int spanEnd); + + public T GetObject (long handle); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Shows declared global variables", ShowReturnType = false)] + public object GetVars (); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Render an image from a path or URI")] + public static Image Image (Uri uri); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Render an image from a path or URI, or SVG data")] + public static Image Image (string uriOrTextData); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Render an image from raw data")] + public static Image Image (byte[] data); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Render an image from a stream")] + public static Task ImageAsync (Stream stream); + + [EvaluationContextGlobalObject.InteractiveHelpAttribute (Description = "Uses a Stopwatch to time the specified action delegate")] + public static TimeSpan Time (Action action); + } public struct EvaluationContextId : IEquatable { public static bool operator == (EvaluationContextId a, EvaluationContextId b); diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/ClientSessionKind.cs b/Agents/Xamarin.Interactive/ClientSessionKind.cs similarity index 100% rename from Bootstrap/Xamarin.Interactive.Bootstrap/ClientSessionKind.cs rename to Agents/Xamarin.Interactive/ClientSessionKind.cs diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/ClientSessionUri.cs b/Agents/Xamarin.Interactive/ClientSessionUri.cs similarity index 100% rename from Bootstrap/Xamarin.Interactive.Bootstrap/ClientSessionUri.cs rename to Agents/Xamarin.Interactive/ClientSessionUri.cs diff --git a/Agents/Xamarin.Interactive/CodeAnalysis/EvaluationContextGlobalObject.cs b/Agents/Xamarin.Interactive/CodeAnalysis/EvaluationContextGlobalObject.cs index 73f6e4a35..96f852075 100644 --- a/Agents/Xamarin.Interactive/CodeAnalysis/EvaluationContextGlobalObject.cs +++ b/Agents/Xamarin.Interactive/CodeAnalysis/EvaluationContextGlobalObject.cs @@ -103,8 +103,8 @@ ReplHelp GetCachedHelp () return cachedHelp; } - [InteractiveHelp (Description = "This help text")] - public ReplHelp help => GetCachedHelp (); + [InteractiveHelp (Description = "This help text", ShowReturnType = false)] + public object help => GetCachedHelp (); [InteractiveHelp (Description = "Direct public access to the agent powering the interactive session")] public IAgent InteractiveAgent => agent; diff --git a/Agents/Xamarin.Interactive/Core/Agent.cs b/Agents/Xamarin.Interactive/Core/Agent.cs index d04f6411a..1617502e6 100644 --- a/Agents/Xamarin.Interactive/Core/Agent.cs +++ b/Agents/Xamarin.Interactive/Core/Agent.cs @@ -257,8 +257,7 @@ public Agent Start (AgentStartOptions startOptions = null) Identity.Host, Identity.Port); - InspectorSupport.AgentStarted (ClientSessionUri); - InspectorSupport.AgentStartedHandler?.Invoke (this); + startOptions?.AgentStarted?.Invoke (ClientSessionUri); try { var identifyAgentRequest = GetIdentifyAgentRequest (); diff --git a/Agents/Xamarin.Interactive/Core/AgentStartOptions.cs b/Agents/Xamarin.Interactive/Core/AgentStartOptions.cs index 940f6e92a..c13bd25df 100644 --- a/Agents/Xamarin.Interactive/Core/AgentStartOptions.cs +++ b/Agents/Xamarin.Interactive/Core/AgentStartOptions.cs @@ -5,13 +5,18 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; + using Xamarin.Interactive.Client; namespace Xamarin.Interactive.Core { - public class AgentStartOptions + sealed class AgentStartOptions { internal ClientSessionKind? ClientSessionKind { get; set; } + public ushort? Port { get; set; } + + public Action AgentStarted { get; set; } } } \ No newline at end of file diff --git a/Agents/Xamarin.Interactive/Core/TypeSpec.cs b/Agents/Xamarin.Interactive/Core/TypeSpec.cs index beec8f860..c06602586 100644 --- a/Agents/Xamarin.Interactive/Core/TypeSpec.cs +++ b/Agents/Xamarin.Interactive/Core/TypeSpec.cs @@ -13,7 +13,7 @@ namespace Xamarin.Interactive.Core { [Serializable] - public sealed class TypeSpec + sealed class TypeSpec { [Serializable] public struct TypeName : IEquatable diff --git a/Agents/Xamarin.Interactive/DebuggingSupport.cs b/Agents/Xamarin.Interactive/DebuggingSupport.cs index 70080bd56..a307b5b37 100644 --- a/Agents/Xamarin.Interactive/DebuggingSupport.cs +++ b/Agents/Xamarin.Interactive/DebuggingSupport.cs @@ -26,7 +26,7 @@ static class DebuggingSupport public static void LaunchClientAppForDebugging (Agent agent) { -#if !NETSTANDARD2_0 && DEBUG +#if DEBUG if (!Debugger.IsAttached) return; diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/FrameworkNames.cs b/Agents/Xamarin.Interactive/FrameworkNames.cs similarity index 100% rename from Bootstrap/Xamarin.Interactive.Bootstrap/FrameworkNames.cs rename to Agents/Xamarin.Interactive/FrameworkNames.cs diff --git a/Agents/Xamarin.Interactive/InspectorSupport.cs b/Agents/Xamarin.Interactive/InspectorSupport.cs deleted file mode 100644 index 4f0f94000..000000000 --- a/Agents/Xamarin.Interactive/InspectorSupport.cs +++ /dev/null @@ -1,56 +0,0 @@ -// -// Author: -// Aaron Bockover -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Runtime.CompilerServices; - -using Xamarin.Interactive.Core; - -namespace Xamarin -{ - public static partial class InspectorSupport - { - static Agent agent; - - static partial void CreateAgent (AgentStartOptions startOptions); - - internal static Action AgentStartedHandler; - - #if DEBUG - public static void Start (AgentStartOptions startOptions = null) => CreateAgent (startOptions); - #endif - - static void Start () - { - try { - CreateAgent (null); - } catch (Exception e) { - Console.Error.WriteLine (e); - } - } - - internal static void Stop () - { - agent?.Dispose (); - agent = null; - } - - [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] - static void BreakdanceStep () - { - } - - #if !WPF - - [MethodImpl (MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] - internal static void AgentStarted (string agentConnectUri) - { - } - - #endif - } -} \ No newline at end of file diff --git a/Agents/Xamarin.Interactive/InteractiveCulture.cs b/Agents/Xamarin.Interactive/InteractiveCulture.cs index 5cac3a6cf..ffbd35618 100644 --- a/Agents/Xamarin.Interactive/InteractiveCulture.cs +++ b/Agents/Xamarin.Interactive/InteractiveCulture.cs @@ -18,9 +18,8 @@ public static class InteractiveCulture [EditorBrowsable (EditorBrowsableState.Never)] public static void Initialize () { -#if !WPF + // WPF sets this in its app.config, but calling here does no harm AppContext.SetSwitch ("Switch.System.Globalization.NoAsyncCurrentCulture", true); -#endif } [ThreadStatic] diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/InteractiveInstallation.cs b/Agents/Xamarin.Interactive/InteractiveInstallation.cs similarity index 75% rename from Bootstrap/Xamarin.Interactive.Bootstrap/InteractiveInstallation.cs rename to Agents/Xamarin.Interactive/InteractiveInstallation.cs index 0df0f73d6..db1935e95 100644 --- a/Bootstrap/Xamarin.Interactive.Bootstrap/InteractiveInstallation.cs +++ b/Agents/Xamarin.Interactive/InteractiveInstallation.cs @@ -5,15 +5,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#if !NETSTANDARD2_0 - using System; using System.Collections.Generic; using System.IO; using System.Linq; -using Microsoft.Win32; - using Xamarin.Interactive.Client; namespace Xamarin.Interactive @@ -22,22 +18,22 @@ class InteractiveInstallation { public static InteractiveInstallation Default { get; private set; } - public static void InitializeDefault (bool isMac, string buildPath) + public static void InitializeDefault ( + bool isMac, + string buildPath, + InteractiveInstallationPaths installationPaths = null) { if (Default != null) throw new InvalidOperationException ("InitializeDefault has already been called"); - Default = new InteractiveInstallation (isMac, buildPath, null); + Default = new InteractiveInstallation (isMac, buildPath, installationPaths); } - const string MacFrameworkInstallPath = "Library/Frameworks/Xamarin.Interactive.framework/Versions/Current"; - readonly Dictionary> agentAssemblyPaths = new Dictionary> (); readonly Dictionary> formsAgentAssemblyPaths = new Dictionary> (); List clientAppPaths; - List netStandardRefAssemblyPaths; readonly string workbooksClientInstallPath; readonly string inspectorClientInstallPath; @@ -49,59 +45,21 @@ readonly Dictionary> formsAgentAssemblyPaths public bool IsMac { get; } - public InteractiveInstallation (bool isMac, string buildPath, string installRootPath) + InteractiveInstallation ( + bool isMac, + string buildPath, + InteractiveInstallationPaths installationPaths) { + IsMac = isMac; + // May come in null if initialized by an installed app BuildPath = buildPath ?? String.Empty; - if (isMac) { - IsMac = true; - if (String.IsNullOrEmpty (installRootPath)) - installRootPath = "/"; - - workbooksClientInstallPath = Path.Combine ( - installRootPath, - "Applications"); - - inspectorClientInstallPath = Path.Combine ( - installRootPath, - MacFrameworkInstallPath, - "InspectorClient"); - - agentsInstallPath = Path.Combine ( - installRootPath, - MacFrameworkInstallPath); - - WorkbookAppsInstallPath = agentsInstallPath; - - toolsInstallPath = Path.Combine ( - installRootPath, - MacFrameworkInstallPath, - "Tools"); - - return; - } - - // On Windows, client and agent assemblies are installed elsewhere - using (var clientExeKey = RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry32) - .OpenSubKey (@"Software\Xamarin\Workbooks\")) { - if (clientExeKey == null) - return; - - var clientExePath = clientExeKey.GetValue ("location") as string; - if (String.IsNullOrEmpty (clientExePath)) - return; - - inspectorClientInstallPath = workbooksClientInstallPath = - Path.GetDirectoryName (clientExePath); - - agentsInstallPath = WorkbookAppsInstallPath = - Path.GetDirectoryName (Path.GetDirectoryName (clientExePath)); - - // agentsInstallPath is the root of our installation in this case--it - // hasn't had `Agents` combined onto it yet, so this is fine. - toolsInstallPath = Path.Combine (agentsInstallPath, "Tools"); - } + workbooksClientInstallPath = installationPaths?.WorkbooksClientInstallPath; + inspectorClientInstallPath = installationPaths?.InspectorClientInstallPath; + agentsInstallPath = installationPaths?.AgentsInstallPath; + WorkbookAppsInstallPath = installationPaths?.WorkbookAppsInstallPath; + toolsInstallPath = installationPaths?.ToolsInstallPath; } public string LocateFormsAssembly (AgentType agentType) @@ -154,26 +112,6 @@ internal IReadOnlyList LocateSimCheckerExecutables () return simCheckerExecutablePaths; } - public string LocateNetStandardRefAssembly () - => LocateNetStandardRefAssemblies ().FirstOrDefault (); - - internal IReadOnlyList LocateNetStandardRefAssemblies () - { - if (netStandardRefAssemblyPaths != null) - return netStandardRefAssemblyPaths; - - var searchPaths = new List (); - if (agentsInstallPath != null) - searchPaths.Add (agentsInstallPath); - if (BuildPath != null) - searchPaths.Add (Path.Combine ( - BuildPath, "Agents", "Xamarin.Interactive.NetStandard")); - - netStandardRefAssemblyPaths = LocateFiles (searchPaths, "ref-Xamarin.Interactive.dll").ToList (); - - return netStandardRefAssemblyPaths; - } - public string LocateAgentAssembly (AgentType agentType) => LocateAgentAssemblies (agentType).FirstOrDefault (); @@ -317,5 +255,3 @@ static IEnumerable EnumerateFiles (string path, string searchPattern, bo } } } - -#endif \ No newline at end of file diff --git a/Agents/Xamarin.Interactive/InteractiveInstallationPaths.cs b/Agents/Xamarin.Interactive/InteractiveInstallationPaths.cs new file mode 100644 index 000000000..ddab8604a --- /dev/null +++ b/Agents/Xamarin.Interactive/InteractiveInstallationPaths.cs @@ -0,0 +1,43 @@ +// +// Author: +// Sandy Armstrong +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; + +namespace Xamarin.Interactive +{ + sealed class InteractiveInstallationPaths + { + public string WorkbooksClientInstallPath { get; } + public string InspectorClientInstallPath { get; } + public string AgentsInstallPath { get; } + public string WorkbookAppsInstallPath { get; } + public string ToolsInstallPath { get; } + + public InteractiveInstallationPaths ( + string workbooksClientInstallPath, + string inspectorClientInstallPath, + string agentsInstallPath, + string workbookAppsInstallPath, + string toolsInstallPath) + { + WorkbooksClientInstallPath = workbooksClientInstallPath + ?? throw new ArgumentNullException (nameof (workbooksClientInstallPath)); + + InspectorClientInstallPath = inspectorClientInstallPath + ?? throw new ArgumentNullException (nameof (inspectorClientInstallPath)); + + AgentsInstallPath = agentsInstallPath + ?? throw new ArgumentNullException (nameof (agentsInstallPath)); + + WorkbookAppsInstallPath = workbookAppsInstallPath + ?? throw new ArgumentNullException (nameof (workbookAppsInstallPath)); + + ToolsInstallPath = toolsInstallPath + ?? throw new ArgumentNullException (nameof (toolsInstallPath)); + } + } +} diff --git a/Agents/Xamarin.Interactive/NativeHelper.cs b/Agents/Xamarin.Interactive/NativeHelper.cs new file mode 100644 index 000000000..449c3948a --- /dev/null +++ b/Agents/Xamarin.Interactive/NativeHelper.cs @@ -0,0 +1,56 @@ +// +// Author: +// Sandy Armstrong +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Reflection; + +using Xamarin.Interactive.Representations.Reflection; + +namespace Xamarin.Interactive +{ + class NativeHelper + { + struct Disposable : IDisposable + { + void IDisposable.Dispose () { } + } + + readonly static IDisposable disposable = new Disposable (); + + static NativeHelper sharedInstance; + public static NativeHelper SharedInstance { + get { + if (sharedInstance == null) + sharedInstance = new NativeHelper (); + return sharedInstance; + } + } + + /// + /// Replace default SharedInstance with this instance. + /// + public void Initialize () + { + sharedInstance = this; + } + + public virtual IDisposable TrapNativeExceptions () + => disposable; + + /// + /// Check that a CLR property can be safely invoked on a target object that + /// may wrap a native object. + /// + /// Null if invocation is safe, an error string suitable for an + /// exception message otherwise. + public virtual string CheckProperty ( + PropertyInfo property, + object target, + RepresentedType declaringType) + => null; + } +} \ No newline at end of file diff --git a/Agents/Xamarin.Interactive/ObserverCollection.cs b/Agents/Xamarin.Interactive/ObserverCollection.cs index 5d866d727..3e84af14a 100644 --- a/Agents/Xamarin.Interactive/ObserverCollection.cs +++ b/Agents/Xamarin.Interactive/ObserverCollection.cs @@ -11,7 +11,7 @@ namespace Xamarin.Interactive { - public class ObserverCollection : IObserver + class ObserverCollection : IObserver { readonly Func, IDisposable> subscribeHandler; ImmutableList> observers = ImmutableList>.Empty; diff --git a/Agents/Xamarin.Interactive/ProcessControl/ConsoleRedirection.cs b/Agents/Xamarin.Interactive/ProcessControl/ConsoleRedirection.cs index 02a8ed35b..01073ff39 100644 --- a/Agents/Xamarin.Interactive/ProcessControl/ConsoleRedirection.cs +++ b/Agents/Xamarin.Interactive/ProcessControl/ConsoleRedirection.cs @@ -13,7 +13,7 @@ namespace Xamarin.ProcessControl { - public sealed class ConsoleRedirection + sealed class ConsoleRedirection { public enum FileDescriptor { diff --git a/Agents/Xamarin.Interactive/ProcessControl/Exec.cs b/Agents/Xamarin.Interactive/ProcessControl/Exec.cs index 4b3f06074..1e04dcb22 100644 --- a/Agents/Xamarin.Interactive/ProcessControl/Exec.cs +++ b/Agents/Xamarin.Interactive/ProcessControl/Exec.cs @@ -17,7 +17,7 @@ namespace Xamarin.ProcessControl { using static ExecFlags; - public sealed class Exec + sealed class Exec { public sealed class ExecLog : EventArgs { diff --git a/Agents/Xamarin.Interactive/ProcessControl/ExecFlags.cs b/Agents/Xamarin.Interactive/ProcessControl/ExecFlags.cs index bfe20e7cd..8cff3f223 100644 --- a/Agents/Xamarin.Interactive/ProcessControl/ExecFlags.cs +++ b/Agents/Xamarin.Interactive/ProcessControl/ExecFlags.cs @@ -10,7 +10,7 @@ namespace Xamarin.ProcessControl { [Flags] - public enum ExecFlags + enum ExecFlags { None = 0 << 0, RedirectStdin = 1 << 0, diff --git a/Agents/Xamarin.Interactive/ProcessControl/Glob.cs b/Agents/Xamarin.Interactive/ProcessControl/Glob.cs index 343ab4d22..4ab6aeb9c 100644 --- a/Agents/Xamarin.Interactive/ProcessControl/Glob.cs +++ b/Agents/Xamarin.Interactive/ProcessControl/Glob.cs @@ -14,7 +14,7 @@ namespace Xamarin.ProcessControl { - public static class Glob + static class Glob { static string [] ParseParts (string path, out string rootComponent) { diff --git a/Agents/Xamarin.Interactive/ProcessControl/ProcessArguments.cs b/Agents/Xamarin.Interactive/ProcessControl/ProcessArguments.cs index c2585872b..db324235a 100644 --- a/Agents/Xamarin.Interactive/ProcessControl/ProcessArguments.cs +++ b/Agents/Xamarin.Interactive/ProcessControl/ProcessArguments.cs @@ -22,7 +22,7 @@ namespace Xamarin.ProcessControl /// /// An immutable list of process arguments. Arguments will be quoted if escaping is necessary. /// - public sealed class ProcessArguments : IReadOnlyList + sealed class ProcessArguments : IReadOnlyList { public static ProcessArguments Parse (string commandLine, bool expandGlobs = true) { diff --git a/Agents/Xamarin.Interactive/Representations/Reflection/ReflectionRemoting.cs b/Agents/Xamarin.Interactive/Representations/Reflection/ReflectionRemoting.cs index 9da52369c..98f3f6206 100644 --- a/Agents/Xamarin.Interactive/Representations/Reflection/ReflectionRemoting.cs +++ b/Agents/Xamarin.Interactive/Representations/Reflection/ReflectionRemoting.cs @@ -18,7 +18,7 @@ namespace Xamarin.Interactive.Representations.Reflection { - public interface IReflectionRemotingVisitor + interface IReflectionRemotingVisitor { void VisitExceptionNode (ExceptionNode exception); void VisitStackTrace (StackTrace stackTrace); @@ -30,7 +30,7 @@ public interface IReflectionRemotingVisitor void VisitTypeSpec (TypeSpec typeSpec); } - public class CSharpWriter : IReflectionRemotingVisitor + class CSharpWriter : IReflectionRemotingVisitor { public class TokenWriter { @@ -409,7 +409,7 @@ void WriteTypeName (TypeSpec typeSpec) } [Serializable] - public abstract class Node + abstract class Node { internal Node () { @@ -419,7 +419,7 @@ internal Node () } [Serializable] - public sealed class ExceptionNode : Node + sealed class ExceptionNode : Node { public TypeSpec Type { get; set; } public string Message { get; set; } @@ -453,7 +453,7 @@ public override string ToString () } [Serializable] - public sealed class StackTrace : Node + sealed class StackTrace : Node { StackFrame [] frames; public IReadOnlyList Frames { @@ -505,7 +505,7 @@ public StackTrace WithCapturedTraces (IEnumerable capturedTraces) } [Serializable] - public sealed class StackFrame : Node + sealed class StackFrame : Node { public string FileName { get; set; } public int Line { get; set; } @@ -685,14 +685,14 @@ public override void AcceptVisitor (IReflectionRemotingVisitor visitor) } } - public interface ITypeMember + interface ITypeMember { TypeSpec DeclaringType { get; } string Name { get; } void AcceptVisitor (IReflectionRemotingVisitor visitor); } - public static class TypeMember + static class TypeMember { public static ITypeMember Create (MemberInfo memberInfo) { @@ -711,7 +711,7 @@ public static ITypeMember Create (MemberInfo memberInfo) } [Serializable] - public sealed class Parameter : Node + sealed class Parameter : Node { public string Name { get; set; } public TypeSpec Type { get; set; } @@ -745,7 +745,7 @@ public override void AcceptVisitor (IReflectionRemotingVisitor visitor) } [Serializable] - public sealed class Method : Node, ITypeMember + sealed class Method : Node, ITypeMember { public string Name { get; set; } public string WrapperType { get; set; } @@ -788,7 +788,7 @@ public override void AcceptVisitor (IReflectionRemotingVisitor visitor) } [Serializable] - public sealed class Field : Node, ITypeMember + sealed class Field : Node, ITypeMember { public string Name { get; set; } public TypeSpec DeclaringType { get; set; } @@ -815,7 +815,7 @@ public override void AcceptVisitor (IReflectionRemotingVisitor visitor) } [Serializable] - public sealed class Property : Node, ITypeMember + sealed class Property : Node, ITypeMember { public string Name { get; set; } public TypeSpec DeclaringType { get; set; } diff --git a/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedMemberInfo.cs b/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedMemberInfo.cs index 1a98aac8b..1fb4392de 100644 --- a/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedMemberInfo.cs +++ b/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedMemberInfo.cs @@ -12,15 +12,12 @@ namespace Xamarin.Interactive.Representations.Reflection { [Serializable] - public sealed class RepresentedMemberInfo : IRepresentedMemberInfo, ISerializable + sealed class RepresentedMemberInfo : IRepresentedMemberInfo, ISerializable { readonly object resolveLock = new object (); bool resolved; - - #if MAC || IOS - bool checkedForObjCSelector; - ObjCRuntime.Selector objCSelector; - #endif + bool checkedNativeProperty; + string nativePropertyError; public RepresentedType DeclaringType { get; private set; } public RepresentedMemberKind MemberKind { get; private set; } @@ -122,9 +119,17 @@ public object GetValue (object target) var property = ResolvedMemberInfo as PropertyInfo; if (property != null) { - #if MAC || IOS - EnsureRespondsToSelector (property, target); - #endif + if (!checkedNativeProperty) { + checkedNativeProperty = true; + nativePropertyError = NativeHelper.SharedInstance.CheckProperty ( + property, + target, + DeclaringType); + } + + if (nativePropertyError != null) + throw new Exception (nativePropertyError); + return property.GetValue (target); } @@ -132,35 +137,6 @@ public object GetValue (object target) $"unsupported MemberInfo {ResolvedMemberInfo.GetType ()}"); } - #if MAC || IOS - - void EnsureRespondsToSelector (PropertyInfo property, object target) - { - if (!checkedForObjCSelector) { - checkedForObjCSelector = true; - if (typeof(Foundation.NSObject).IsAssignableFrom (DeclaringType.ResolvedType)) { - var selName = property - ?.GetGetMethod (true) - ?.GetCustomAttribute () - ?.Selector; - if (selName != null) - objCSelector = new ObjCRuntime.Selector (selName); - } - } - - if (objCSelector == null || objCSelector.Handle == IntPtr.Zero) - return; - - var nso = target as Foundation.NSObject; - if (nso == null || nso.RespondsToSelector (objCSelector)) - return; - - throw new Exception (String.Format ("{0} instance 0x{1:x} does not respond to selector {2}", - target.GetType (), nso.Handle, objCSelector.Name)); - } - - #endif - void EnsureResolved () { if (Resolve () == null) diff --git a/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedType.cs b/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedType.cs index 4a219d139..ebdd233d5 100644 --- a/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedType.cs +++ b/Agents/Xamarin.Interactive/Representations/Reflection/RepresentedType.cs @@ -16,7 +16,7 @@ namespace Xamarin.Interactive.Representations.Reflection { [Serializable] - public sealed class RepresentedType : IRepresentedType, ISerializable, IObjectReference + sealed class RepresentedType : IRepresentedType, ISerializable, IObjectReference { static readonly ReaderWriterLockSlim resolveLock = new ReaderWriterLockSlim (); static readonly Dictionary fromStringMap diff --git a/Agents/Xamarin.Interactive/Representations/ReflectionInteractiveObject.cs b/Agents/Xamarin.Interactive/Representations/ReflectionInteractiveObject.cs index 1ef9265ba..f04b323f8 100644 --- a/Agents/Xamarin.Interactive/Representations/ReflectionInteractiveObject.cs +++ b/Agents/Xamarin.Interactive/Representations/ReflectionInteractiveObject.cs @@ -50,12 +50,8 @@ protected override void Prepare () protected override void ReadMembers () { - try { - NativeExceptionHandler.Trap (); + using (NativeHelper.SharedInstance.TrapNativeExceptions ()) SafeReadMembers (); - } finally { - NativeExceptionHandler.Release (); - } } void SafeReadMembers () diff --git a/Agents/Xamarin.Interactive/Representations/ReplHelp.cs b/Agents/Xamarin.Interactive/Representations/ReplHelp.cs index 6447f5908..9f973cc18 100644 --- a/Agents/Xamarin.Interactive/Representations/ReplHelp.cs +++ b/Agents/Xamarin.Interactive/Representations/ReplHelp.cs @@ -15,7 +15,7 @@ namespace Xamarin.Interactive.Representations { [Serializable] - public sealed class ReplHelp : IRepresentationObject, IEnumerable + sealed class ReplHelp : IRepresentationObject, IEnumerable { [Serializable] public struct Item : IRepresentationObject diff --git a/Agents/Xamarin.Interactive/Representations/RepresentedObject.cs b/Agents/Xamarin.Interactive/Representations/RepresentedObject.cs index 0a24a13c8..2c46836ca 100644 --- a/Agents/Xamarin.Interactive/Representations/RepresentedObject.cs +++ b/Agents/Xamarin.Interactive/Representations/RepresentedObject.cs @@ -19,7 +19,7 @@ namespace Xamarin.Interactive.Representations // and an InteractiveObject representation. We don't return an array // directly since we might tack on more result metadata in the future. [Serializable] - public sealed class RepresentedObject : IReadOnlyList + sealed class RepresentedObject : IReadOnlyList { readonly RepresentedType representedType; Representation [] representations; diff --git a/Agents/Xamarin.Interactive/Xamarin.Interactive.csproj b/Agents/Xamarin.Interactive/Xamarin.Interactive.csproj index 8084805af..ba7ae1cce 100644 --- a/Agents/Xamarin.Interactive/Xamarin.Interactive.csproj +++ b/Agents/Xamarin.Interactive/Xamarin.Interactive.csproj @@ -1,125 +1,21 @@ - - + + - Debug - AnyCPU - 8.0.30703 - {955F473A-04EC-4716-B75E-509BA892499B} - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - Library - Xamarin.Interactive - Xamarin.Interactive - v4.5 - Profile111 + netstandard2.0 + - true - portable - false - bin\Debug - DEBUG;PCL - prompt - 4 - true true - true - bin\Release - PCL - prompt - 4 - true - true true - portable + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C} - Xamarin.Interactive.Facades - - - diff --git a/Agents/Xamarin.Interactive/Xamarin.Interactive.nuspec b/Agents/Xamarin.Interactive/Xamarin.Interactive.nuspec index 77a3e839c..a7df546a1 100644 --- a/Agents/Xamarin.Interactive/Xamarin.Interactive.nuspec +++ b/Agents/Xamarin.Interactive/Xamarin.Interactive.nuspec @@ -19,6 +19,6 @@ xamarin workbooks interactive - + diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.projitems b/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.projitems deleted file mode 100644 index b89354c2e..000000000 --- a/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.projitems +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {2ECF1997-1B8A-4C03-8CA9-9710A820C4FC} - - - Xamarin.Inspector.Build - - - - - - - - \ No newline at end of file diff --git a/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.shproj b/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.shproj deleted file mode 100644 index 72ed19891..000000000 --- a/Bootstrap/Xamarin.Interactive.Bootstrap/Xamarin.Interactive.Bootstrap.shproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - {2ECF1997-1B8A-4C03-8CA9-9710A820C4FC} - 8.0.30703 - - - - - - - diff --git a/Build.proj b/Build.proj index 8b36290b7..25089676e 100644 --- a/Build.proj +++ b/Build.proj @@ -69,7 +69,7 @@ - 1.0.0-rc4 + 1.0.0-rc5 @@ -198,8 +198,8 @@ - - + + @@ -233,14 +233,19 @@ + + + + + + - @@ -276,10 +281,6 @@ SkipUnchangedFiles="true" SourceFiles="@(DotNetCoreAgentFiles)" DestinationFolder="$(FrameworkInstallDir)Agents\DotNetCore"/> - @@ -395,8 +396,8 @@ - $(MSBuildThisFileDirectory)Agents\Xamarin.Interactive\bin\$(Configuration)\Xamarin.Interactive.dll - $(MSBuildThisFileDirectory)Agents\Xamarin.Interactive\bin\$(Configuration)\Xamarin.Interactive.Stripped.dll + $(MSBuildThisFileDirectory)Agents\Xamarin.Interactive\bin\$(Configuration)\netstandard2.0\Xamarin.Interactive.dll + $(MSBuildThisFileDirectory)Agents\Xamarin.Interactive\bin\$(Configuration)\netstandard2.0\Xamarin.Interactive.Stripped.dll @@ -473,7 +474,7 @@ Projects="Tools\ApiDump\ApiDump.csproj;Agents\Xamarin.Interactive\Xamarin.Interactive.csproj" Properties="Configuration=Release" Targets="Build"/> - + UnifiedExtensions.cs + + NativeExceptionHandler.cs + diff --git a/Clients/Xamarin.Interactive.Client.Mac/Xamarin.Mac/NSWindowExtensions.cs b/Clients/Xamarin.Interactive.Client.Mac/Xamarin.Mac/NSWindowExtensions.cs index 3a6af3dfd..aeca8d94a 100644 --- a/Clients/Xamarin.Interactive.Client.Mac/Xamarin.Mac/NSWindowExtensions.cs +++ b/Clients/Xamarin.Interactive.Client.Mac/Xamarin.Mac/NSWindowExtensions.cs @@ -12,6 +12,7 @@ using ObjCRuntime; using Xamarin.Interactive.Logging; +using Xamarin.Interactive.Unified; namespace Xamarin.Interactive.Client.Mac { diff --git a/Clients/Xamarin.Interactive.Client.Windows/Views/VisualTree.xaml b/Clients/Xamarin.Interactive.Client.Windows/Views/VisualTree.xaml index a22a9370f..9f01eea02 100644 --- a/Clients/Xamarin.Interactive.Client.Windows/Views/VisualTree.xaml +++ b/Clients/Xamarin.Interactive.Client.Windows/Views/VisualTree.xaml @@ -4,7 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:remote="clr-namespace:Xamarin.Interactive.Remote;assembly=Xamarin.Interactive.Client" + xmlns:remote="clr-namespace:Xamarin.Interactive.Remote;assembly=Xamarin.Interactive" xmlns:views="clr-namespace:Xamarin.Interactive.Client.Windows.Views" xmlns:converters="clr-namespace:Xamarin.Interactive.Client.Windows.Converters" mc:Ignorable="d" diff --git a/Clients/Xamarin.Interactive.Client/ClientApp.cs b/Clients/Xamarin.Interactive.Client/ClientApp.cs index 9b02462c2..02d7f6ebb 100644 --- a/Clients/Xamarin.Interactive.Client/ClientApp.cs +++ b/Clients/Xamarin.Interactive.Client/ClientApp.cs @@ -12,6 +12,8 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.Win32; + using Xamarin.Interactive.Client; using Xamarin.Interactive.Client.Updater; using Xamarin.Interactive.Core; @@ -136,9 +138,15 @@ public void Initialize ( if (asSharedInstance) SharedInstance = this; + // Support both Mac and Windows installation paths in the base class + // so that ConsoleClientApp does not need to be built differently on + // different platforms. InteractiveInstallation.InitializeDefault ( Host.IsMac, - DevEnvironment.RepositoryRootDirectory); + DevEnvironment.RepositoryRootDirectory, + Host.IsMac + ? GetMacInstallationPaths () + : GetWindowsInstallationPaths ()); new Telemetry.Events.AppSessionStart ().Post (); @@ -322,5 +330,43 @@ public async Task WriteIssueReportForClipboardAsync (TextWriter writer) } } } + + static InteractiveInstallationPaths GetWindowsInstallationPaths () + { + using (var clientExeKey = RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry32) + .OpenSubKey (@"Software\Xamarin\Workbooks\")) { + var clientExePath = clientExeKey?.GetValue ("location") as string; + if (String.IsNullOrEmpty (clientExePath)) + return null; + + var clientInstallPath = Path.GetDirectoryName (clientExePath); + var frameworkInstallPath = Path.GetDirectoryName (clientInstallPath); + + return new InteractiveInstallationPaths ( + workbooksClientInstallPath: clientInstallPath, + inspectorClientInstallPath: clientInstallPath, + agentsInstallPath: frameworkInstallPath, + workbookAppsInstallPath: frameworkInstallPath, + toolsInstallPath: Path.Combine (frameworkInstallPath, "Tools")); + } + } + + static InteractiveInstallationPaths GetMacInstallationPaths () + { + const string MacFrameworkInstallPath = "Library/Frameworks/Xamarin.Interactive.framework/Versions/Current"; + + var installRootPath = "/"; + + var frameworkInstallPath = Path.Combine ( + installRootPath, + MacFrameworkInstallPath); + + return new InteractiveInstallationPaths ( + workbooksClientInstallPath: Path.Combine (installRootPath, "Applications"), + inspectorClientInstallPath: Path.Combine (frameworkInstallPath, "InspectorClient"), + agentsInstallPath: frameworkInstallPath, + workbookAppsInstallPath: frameworkInstallPath, + toolsInstallPath: Path.Combine (frameworkInstallPath, "Tools")); + } } } \ No newline at end of file diff --git a/Clients/Xamarin.Interactive.Client/Compilation/CompilationWorkspaceFactory.cs b/Clients/Xamarin.Interactive.Client/Compilation/CompilationWorkspaceFactory.cs index 6bd2cf397..42f08a63e 100644 --- a/Clients/Xamarin.Interactive.Client/Compilation/CompilationWorkspaceFactory.cs +++ b/Clients/Xamarin.Interactive.Client/Compilation/CompilationWorkspaceFactory.cs @@ -164,17 +164,14 @@ static InteractiveDependencyResolver CreateDependencyResolver ( return dependencyResolver; } + static Assembly netStandardAssembly; + static Assembly xiAssembly; + static Type ResolveHostObjectType ( InteractiveDependencyResolver dependencyResolver, TargetCompilationConfiguration configuration, AgentType agentType) { - if (agentType == AgentType.DotNetCore) { - return Assembly - .ReflectionOnlyLoadFrom (InteractiveInstallation.Default.LocateNetStandardRefAssembly ()) - .GetType (configuration.GlobalStateTypeName); - } - using (var assemblyContext = new EvaluationAssemblyContext ()) { string globalStateAssemblyCachePath = null; if (configuration.GlobalStateAssembly.Content.PEImage != null) @@ -188,15 +185,31 @@ static Type ResolveHostObjectType ( assemblyContext.AddRange (resolvedAssemblies); - var globalStateAssembly = resolvedAssemblies.First ( + var globalStateAssemblyDef = resolvedAssemblies.First ( assembly => ResolvedAssembly.NameEqualityComparer.Default.Equals ( assembly.Name, configuration.GlobalStateAssembly.Name)); - return Assembly - .ReflectionOnlyLoadFrom ( - globalStateAssemblyCachePath ?? globalStateAssembly.Content.Location) - .GetType (configuration.GlobalStateTypeName); + netStandardAssembly = netStandardAssembly ?? + Assembly.ReflectionOnlyLoadFrom ( + new FilePath (Assembly.GetExecutingAssembly ().Location) + .ParentDirectory + .Combine ("netstandard.dll")); + + xiAssembly = xiAssembly ?? + Assembly.ReflectionOnlyLoadFrom ( + new FilePath (Assembly.GetExecutingAssembly ().Location) + .ParentDirectory + .Combine ("Xamarin.Interactive.dll")); + + Assembly globalStateAssembly; + if (globalStateAssemblyDef.Name.Name == "Xamarin.Interactive") + globalStateAssembly = xiAssembly; + else + globalStateAssembly = Assembly.ReflectionOnlyLoadFrom ( + globalStateAssemblyCachePath ?? globalStateAssemblyDef.Content.Location); + + return globalStateAssembly.GetType (configuration.GlobalStateTypeName); } } } diff --git a/Clients/Xamarin.Interactive.Client/NuGet/InteractivePackageManager.cs b/Clients/Xamarin.Interactive.Client/NuGet/InteractivePackageManager.cs index 6ec9ffcdc..b93f943bd 100644 --- a/Clients/Xamarin.Interactive.Client/NuGet/InteractivePackageManager.cs +++ b/Clients/Xamarin.Interactive.Client/NuGet/InteractivePackageManager.cs @@ -41,7 +41,7 @@ sealed class InteractivePackageManager : INotifyPropertyChanged internal static readonly PackageIdentity FixedXamarinFormsPackageIdentity = new PackageIdentity ( "Xamarin.Forms", - new NuGetVersion (2, 3, 4, 231)); + new NuGetVersion (2, 4, 0, 38779)); readonly NuGetPackageManager packageManager; readonly InteractivePackageProjectContext projectContext; diff --git a/Clients/Xamarin.Interactive.Client/Xamarin.Interactive.Client.csproj b/Clients/Xamarin.Interactive.Client/Xamarin.Interactive.Client.csproj index fdf675bfa..2f4e5cd53 100644 --- a/Clients/Xamarin.Interactive.Client/Xamarin.Interactive.Client.csproj +++ b/Clients/Xamarin.Interactive.Client/Xamarin.Interactive.Client.csproj @@ -41,7 +41,5 @@ - - \ No newline at end of file diff --git a/Package/Windows/AgentAppFiles.wxs b/Package/Windows/AgentAppFiles.wxs index 14a5082ea..b2ded691b 100644 --- a/Package/Windows/AgentAppFiles.wxs +++ b/Package/Windows/AgentAppFiles.wxs @@ -15,6 +15,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Windows/AgentFiles.wxs b/Package/Windows/AgentFiles.wxs index a306ed090..704b8f49b 100644 --- a/Package/Windows/AgentFiles.wxs +++ b/Package/Windows/AgentFiles.wxs @@ -1,56 +1,340 @@ - + - + - + - + - - + - + + + + - - + - + - - + - + + + + - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - @@ -64,69 +348,63 @@ - - - - - - + - + - - + - + - - + - + - - + - + + + + - - + - + - - + - + - - + - + - - + - + + + + diff --git a/Package/Windows/AndroidAgentAppAssemblies.wxs b/Package/Windows/AndroidAgentAppAssemblies.wxs index 05ed7d4f2..212cc4028 100644 --- a/Package/Windows/AndroidAgentAppAssemblies.wxs +++ b/Package/Windows/AndroidAgentAppAssemblies.wxs @@ -240,8 +240,8 @@ - - + + @@ -662,11 +662,32 @@ - - + + - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Windows/ClientFiles.wxs b/Package/Windows/ClientFiles.wxs index 5dd6a5fbd..433cb129a 100644 --- a/Package/Windows/ClientFiles.wxs +++ b/Package/Windows/ClientFiles.wxs @@ -1,6 +1,7 @@  + @@ -25,8 +26,9 @@ + - + @@ -175,9 +177,6 @@ - - - @@ -223,7 +222,244 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Windows/Xamarin.Interactive.Windows.Installer.wixproj b/Package/Windows/Xamarin.Interactive.Windows.Installer.wixproj index ecb2152d5..6f97ae764 100644 --- a/Package/Windows/Xamarin.Interactive.Windows.Installer.wixproj +++ b/Package/Windows/Xamarin.Interactive.Windows.Installer.wixproj @@ -197,13 +197,6 @@ Binaries;Content;Satellites INSTALLFOLDER - - Xamarin.Interactive.NetStandard - True - True - Binaries;Content;Satellites - INSTALLFOLDER - diff --git a/Package/Windows/iOSWorkbookAppFiles.wxs b/Package/Windows/iOSWorkbookAppFiles.wxs index c425a92f0..850ec8058 100644 --- a/Package/Windows/iOSWorkbookAppFiles.wxs +++ b/Package/Windows/iOSWorkbookAppFiles.wxs @@ -61,9 +61,6 @@ - - - @@ -79,33 +76,18 @@ - - - - - - - - - - - - - - - @@ -124,21 +106,9 @@ - - - - - - - - - - - - @@ -151,21 +121,6 @@ - - - - - - - - - - - - - - - @@ -211,6 +166,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Main.cs b/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Main.cs index e16b6ea5e..4ca24d58e 100644 --- a/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Main.cs +++ b/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Main.cs @@ -52,22 +52,26 @@ static void StartInspectorIntegration () Console.WriteLine ($" path: {agentAssemblyPath}"); Console.WriteLine ($" mtime: {File.GetLastWriteTime (agentAssemblyPath)}"); + Assembly.LoadFrom (Path.Combine ( + Path.GetDirectoryName (InteractiveInstallation.Default.LocateAgentAssembly (AgentType.Console)), + "netstandard.dll")); + inspectorSupportType = Assembly .LoadFrom (agentAssemblyPath) .GetType ("Xamarin.InspectorSupport"); inspectorSupportType .GetField ("AgentStartedHandler", bindingFlags) - .SetValue (null, new Action (AgentStarted)); + .SetValue (null, new Action (AgentStarted)); inspectorSupportType .GetMethod ("Start", bindingFlags) .Invoke (null, null); } - static void AgentStarted (object agent) + static void AgentStarted (string agentConnectUri) { - Console.WriteLine ($"AgentStarted invoked: {agent}. Success."); + Console.WriteLine ($"AgentStarted invoked: {agentConnectUri}. Success."); exit (0); } } diff --git a/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Xamarin.Interactive.Tests.InspectorSupport.Mac.csproj b/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Xamarin.Interactive.Tests.InspectorSupport.Mac.csproj index 3d513d658..cd199b4d9 100644 --- a/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Xamarin.Interactive.Tests.InspectorSupport.Mac.csproj +++ b/Tests/Xamarin.Interactive.Tests.InspectorSupport.Mac/Xamarin.Interactive.Tests.InspectorSupport.Mac.csproj @@ -72,10 +72,13 @@ - + InteractiveInstallation.cs - + + InteractiveInstallationPaths.cs + + ClientSessionKind.cs diff --git a/Tests/Xamarin.Interactive.Tests/ApiDiffTests.cs b/Tests/Xamarin.Interactive.Tests/ApiDiffTests.cs index 2714eceb4..3404a43b6 100644 --- a/Tests/Xamarin.Interactive.Tests/ApiDiffTests.cs +++ b/Tests/Xamarin.Interactive.Tests/ApiDiffTests.cs @@ -29,6 +29,7 @@ public void EnsureNoApiDifferenceAndLint ( basePath, "bin", TestHelpers.Configuration, + "netstandard2.0", assemblyFileName); apiReference = Path.Combine (basePath, apiReference); diff --git a/Tests/Xamarin.Interactive.Tests/NuGetTests.cs b/Tests/Xamarin.Interactive.Tests/NuGetTests.cs index f19623d3b..4b2023379 100644 --- a/Tests/Xamarin.Interactive.Tests/NuGetTests.cs +++ b/Tests/Xamarin.Interactive.Tests/NuGetTests.cs @@ -69,8 +69,8 @@ static InteractivePackageManager CreatePackageManager (FrameworkName targetFrame }, new PackageInstallData { Id = "Xamarin.Forms", - VersionToInstall = new NuGetVersion (2, 3, 4, 231), - ExpectedInstalled = new NuGetVersion (2, 3, 4, 231), + VersionToInstall = InteractivePackageManager.FixedXamarinFormsPackageIdentity.Version, + ExpectedInstalled = InteractivePackageManager.FixedXamarinFormsPackageIdentity.Version, }, new PackageInstallData { Id = "Newtonsoft.Json", @@ -80,12 +80,12 @@ static InteractivePackageManager CreatePackageManager (FrameworkName targetFrame new PackageInstallData { Id = "Xamarin.Forms", VersionToInstall = new NuGetVersion (2, 3, 3, 180), - ExpectedInstalled = new NuGetVersion (2, 3, 4, 231), + ExpectedInstalled = InteractivePackageManager.FixedXamarinFormsPackageIdentity.Version, }, new PackageInstallData { Id = "Xamarin.Forms", - VersionToInstall = new NuGetVersion (2, 3, 5, 233, "pre1", string.Empty), - ExpectedInstalled = new NuGetVersion (2, 3, 4, 231), + VersionToInstall = new NuGetVersion (2, 5, 0, 19271, "pre2", string.Empty), + ExpectedInstalled = InteractivePackageManager.FixedXamarinFormsPackageIdentity.Version, }, new PackageInstallData { Id = "semver", diff --git a/Tools/ApiDump/LintTool.cs b/Tools/ApiDump/LintTool.cs index b83b98b3e..923ea7f66 100644 --- a/Tools/ApiDump/LintTool.cs +++ b/Tools/ApiDump/LintTool.cs @@ -48,7 +48,8 @@ public override void VisitTypeDeclaration (TypeDeclaration typeDeclaration) typeDeclaration.Modifiers.HasFlag (Modifiers.Public) && !typeDeclaration.Modifiers.HasFlag (Modifiers.Sealed) && !typeDeclaration.Modifiers.HasFlag (Modifiers.Static) && - !typeDeclaration.Modifiers.HasFlag (Modifiers.Abstract)) { + !typeDeclaration.Modifiers.HasFlag (Modifiers.Abstract) && + typeDeclaration.Name != "EvaluationContextGlobalObject") { var clone = (TypeDeclaration)typeDeclaration.Clone (); clone.Members.Clear (); issues.Add (new Issue ( diff --git a/Tools/ApiDump/PublicAstVisitor.cs b/Tools/ApiDump/PublicAstVisitor.cs index 56824aae6..9f9a00073 100644 --- a/Tools/ApiDump/PublicAstVisitor.cs +++ b/Tools/ApiDump/PublicAstVisitor.cs @@ -30,7 +30,11 @@ public override void VisitAttribute (Attribute attribute) { var section = (AttributeSection)attribute.Parent; - switch (((SimpleType)attribute.Type).Identifier) { + // Equivalent to SimpleType.Identifier and MemberType.MemberName + // (attribute.Type is a MemberType in the case of inner classes) + var attributeName = attribute.Type.GetChildByRole (Roles.Identifier).Name; + + switch (attributeName) { case "CompilationRelaxations": case "RuntimeCompatibility": case "SecurityPermission": diff --git a/WorkbookApps/Xamarin.Workbooks.Android/Xamarin.Workbooks.Android.csproj b/WorkbookApps/Xamarin.Workbooks.Android/Xamarin.Workbooks.Android.csproj index 5cd7fde44..902dba870 100644 --- a/WorkbookApps/Xamarin.Workbooks.Android/Xamarin.Workbooks.Android.csproj +++ b/WorkbookApps/Xamarin.Workbooks.Android/Xamarin.Workbooks.Android.csproj @@ -60,7 +60,7 @@ - 2.3.4.231 + 2.4.0.38779 diff --git a/WorkbookApps/Xamarin.Workbooks.Wpf/Xamarin.Workbooks.Wpf.csproj b/WorkbookApps/Xamarin.Workbooks.Wpf/Xamarin.Workbooks.Wpf.csproj index 961bc913e..2f07d49c3 100644 --- a/WorkbookApps/Xamarin.Workbooks.Wpf/Xamarin.Workbooks.Wpf.csproj +++ b/WorkbookApps/Xamarin.Workbooks.Wpf/Xamarin.Workbooks.Wpf.csproj @@ -14,6 +14,7 @@ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 + true AnyCPU diff --git a/Xamarin.Interactive.sln b/Xamarin.Interactive.sln index 4bc026f67..6a54df0a6 100644 --- a/Xamarin.Interactive.sln +++ b/Xamarin.Interactive.sln @@ -1,12 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.16 +VisualStudioVersion = 15.0.27004.2005 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Xamarin.Interactive.Shared", "Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.shproj", "{0B64FF4D-4589-438B-A18C-9DA1DE8A2653}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Xamarin.Interactive.Bootstrap", "Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.shproj", "{2ECF1997-1B8A-4C03-8CA9-9710A820C4FC}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Clients", "Clients", "{1918A3C3-EAE4-4F9F-BF6B-83CB94AAF7E9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Client.Mac", "Clients\Xamarin.Interactive.Client.Mac\Xamarin.Interactive.Client.Mac.csproj", "{B813E9C0-FAEF-4661-ABCE-8F3322D451D2}" @@ -57,9 +53,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Build", "Build\Xama EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Workbooks.Mac", "WorkbookApps\Xamarin.Workbooks.Mac\Xamarin.Workbooks.Mac.csproj", "{88DA1F82-8CA2-46A7-B339-8D96C9138515}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive", "Agents\Xamarin.Interactive\Xamarin.Interactive.csproj", "{955F473A-04EC-4716-B75E-509BA892499B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Facades", "Agents\Xamarin.Interactive.Facades\Xamarin.Interactive.Facades.csproj", "{0CB32DEF-71E4-489A-AECE-AFBFCC06854C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Interactive", "Agents\Xamarin.Interactive\Xamarin.Interactive.csproj", "{955F473A-04EC-4716-B75E-509BA892499B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Forms", "Forms", "{88765549-56E0-4B66-BA2D-F49E1446EF94}" EndProject @@ -67,7 +61,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Forms.i EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Forms.Android", "Agents\Xamarin.Interactive.Forms.Android\Xamarin.Interactive.Forms.Android.csproj", "{159A14A0-F8C7-460F-ADF7-967D60E63689}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Forms", "Agents\Xamarin.Interactive.Forms\Xamarin.Interactive.Forms.csproj", "{932D2C61-5DBE-4D82-A4D6-1EA7401F10D3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Interactive.Forms", "Agents\Xamarin.Interactive.Forms\Xamarin.Interactive.Forms.csproj", "{932D2C61-5DBE-4D82-A4D6-1EA7401F10D3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Console", "Agents\Xamarin.Interactive.Console\Xamarin.Interactive.Console.csproj", "{7A522415-E2F7-4E4B-8E11-3D7CF9A854A8}" EndProject @@ -85,8 +79,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiDump", "Tools\ApiDump\Ap EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Interactive.DotNetCore", "Agents\Xamarin.Interactive.DotNetCore\Xamarin.Interactive.DotNetCore.csproj", "{CDF223B4-DD43-42BE-96BB-C1EEC464796C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Interactive.NetStandard", "Agents\Xamarin.Interactive.NetStandard\Xamarin.Interactive.NetStandard.csproj", "{7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Workbooks.DotNetCore", "WorkbookApps\Xamarin.Workbooks.DotNetCore\Xamarin.Workbooks.DotNetCore.csproj", "{5CBBD924-8B0D-4C35-A39B-751DCF9D234D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Interactive.Wpf", "Agents\Xamarin.Interactive.Wpf\Xamarin.Interactive.Wpf.csproj", "{8DFCE7A8-BA80-475D-97C1-DFBCCE17C8E3}" @@ -121,24 +113,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Interactive.Client. EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{0b64ff4d-4589-438b-a18c-9da1de8a2653}*SharedItemsImports = 13 Agents\Xamarin.Interactive.Mac\Xamarin.Interactive.Mac.projitems*{0be4e82e-2409-4425-811d-bc7c8b134320}*SharedItemsImports = 13 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{22fd0fae-d093-446c-9adb-4b59a97f413e}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{22fd0fae-d093-446c-9adb-4b59a97f413e}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{2ecf1997-1b8a-4c03-8ca9-9710a820c4fc}*SharedItemsImports = 13 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{32a8ebc6-bab4-403b-9a8b-89f836cfe95a}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{32a8ebc6-bab4-403b-9a8b-89f836cfe95a}*SharedItemsImports = 4 Agents\Xamarin.Interactive.Mac\Xamarin.Interactive.Mac.projitems*{50e9c7dc-4ff9-44b2-bcce-85a00e3d967e}*SharedItemsImports = 4 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{50e9c7dc-4ff9-44b2-bcce-85a00e3d967e}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{50e9c7dc-4ff9-44b2-bcce-85a00e3d967e}*SharedItemsImports = 4 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{7a522415-e2f7-4e4b-8e11-3d7cf9a854a8}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{7a522415-e2f7-4e4b-8e11-3d7cf9a854a8}*SharedItemsImports = 4 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{8dfce7a8-ba80-475d-97c1-dfbcce17c8e3}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{8dfce7a8-ba80-475d-97c1-dfbcce17c8e3}*SharedItemsImports = 4 Clients\Xamarin.Interactive.MTouch\Xamarin.Interactive.MTouch.projitems*{a31ddded-f400-41be-92ba-6931763c27e7}*SharedItemsImports = 13 Agents\Xamarin.Interactive.Mac\Xamarin.Interactive.Mac.projitems*{af7b7abd-84d4-46b2-80e4-9ca457c513bc}*SharedItemsImports = 4 - Agents\Xamarin.Interactive\Xamarin.Interactive.Shared.projitems*{af7b7abd-84d4-46b2-80e4-9ca457c513bc}*SharedItemsImports = 4 - Bootstrap\Xamarin.Interactive.Bootstrap\Xamarin.Interactive.Bootstrap.projitems*{af7b7abd-84d4-46b2-80e4-9ca457c513bc}*SharedItemsImports = 4 Clients\Xamarin.Interactive.MTouch\Xamarin.Interactive.MTouch.projitems*{b813e9c0-faef-4661-abce-8f3322d451d2}*SharedItemsImports = 4 Clients\Xamarin.Interactive.MTouch\Xamarin.Interactive.MTouch.projitems*{d495e2ae-bf3e-444b-b3d6-91ef14293831}*SharedItemsImports = 4 EndGlobalSection @@ -283,16 +261,6 @@ Global {955F473A-04EC-4716-B75E-509BA892499B}.Release|macOS.Build.0 = Release|Any CPU {955F473A-04EC-4716-B75E-509BA892499B}.Release|Windows.ActiveCfg = Release|Any CPU {955F473A-04EC-4716-B75E-509BA892499B}.Release|Windows.Build.0 = Release|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Debug|macOS.ActiveCfg = Debug|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Debug|macOS.Build.0 = Debug|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Debug|Windows.ActiveCfg = Debug|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Debug|Windows.Build.0 = Debug|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Release|macOS.ActiveCfg = Release|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Release|macOS.Build.0 = Release|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Release|Windows.ActiveCfg = Release|Any CPU - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C}.Release|Windows.Build.0 = Release|Any CPU {A534BEA1-1A39-4355-B6EF-F6A3EF7E65FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A534BEA1-1A39-4355-B6EF-F6A3EF7E65FC}.Debug|macOS.ActiveCfg = Debug|Any CPU {A534BEA1-1A39-4355-B6EF-F6A3EF7E65FC}.Debug|macOS.Build.0 = Debug|Any CPU @@ -393,16 +361,6 @@ Global {CDF223B4-DD43-42BE-96BB-C1EEC464796C}.Release|macOS.Build.0 = Release|Any CPU {CDF223B4-DD43-42BE-96BB-C1EEC464796C}.Release|Windows.ActiveCfg = Release|Any CPU {CDF223B4-DD43-42BE-96BB-C1EEC464796C}.Release|Windows.Build.0 = Release|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Debug|macOS.ActiveCfg = Debug|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Debug|macOS.Build.0 = Debug|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Debug|Windows.ActiveCfg = Debug|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Debug|Windows.Build.0 = Debug|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Release|macOS.ActiveCfg = Release|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Release|macOS.Build.0 = Release|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Release|Windows.ActiveCfg = Release|Any CPU - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D}.Release|Windows.Build.0 = Release|Any CPU {5CBBD924-8B0D-4C35-A39B-751DCF9D234D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CBBD924-8B0D-4C35-A39B-751DCF9D234D}.Debug|macOS.ActiveCfg = Debug|Any CPU {5CBBD924-8B0D-4C35-A39B-751DCF9D234D}.Debug|macOS.Build.0 = Debug|Any CPU @@ -538,8 +496,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {0B64FF4D-4589-438B-A18C-9DA1DE8A2653} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} - {2ECF1997-1B8A-4C03-8CA9-9710A820C4FC} = {0D5D807C-DEBE-498D-B2D8-D75E6C60D15B} {B813E9C0-FAEF-4661-ABCE-8F3322D451D2} = {1918A3C3-EAE4-4F9F-BF6B-83CB94AAF7E9} {32A8EBC6-BAB4-403B-9A8B-89F836CFE95A} = {ED62D731-5B6C-45F6-9A62-B9992E874E27} {0BE4E82E-2409-4425-811D-BC7C8B134320} = {1281F1A8-EB27-4D6C-8E0A-03FBFAA63746} @@ -560,7 +516,6 @@ Global {056196F4-3E6B-43E5-886E-D9C8E9BEACBB} = {0D5D807C-DEBE-498D-B2D8-D75E6C60D15B} {88DA1F82-8CA2-46A7-B339-8D96C9138515} = {5EF281AE-893E-49E8-BBA9-DBE86493BB39} {955F473A-04EC-4716-B75E-509BA892499B} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} - {0CB32DEF-71E4-489A-AECE-AFBFCC06854C} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} {88765549-56E0-4B66-BA2D-F49E1446EF94} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} {A534BEA1-1A39-4355-B6EF-F6A3EF7E65FC} = {88765549-56E0-4B66-BA2D-F49E1446EF94} {159A14A0-F8C7-460F-ADF7-967D60E63689} = {88765549-56E0-4B66-BA2D-F49E1446EF94} @@ -572,7 +527,6 @@ Global {1601EA3E-485F-4710-9937-DCD4C46728CE} = {E3972EA9-3073-4251-AD90-87B4C90147FC} {B44E528A-584A-4BAF-A398-6E2245AA8ED2} = {E3972EA9-3073-4251-AD90-87B4C90147FC} {CDF223B4-DD43-42BE-96BB-C1EEC464796C} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} - {7835BCA4-2F06-4AB8-B5E5-AD7934FFBA2D} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} {5CBBD924-8B0D-4C35-A39B-751DCF9D234D} = {5EF281AE-893E-49E8-BBA9-DBE86493BB39} {8DFCE7A8-BA80-475D-97C1-DFBCCE17C8E3} = {AE0C9371-285B-4540-AB1D-F5141FA66D19} {F98CCE56-C44F-4096-A2FA-7298F339F846} = {5EF281AE-893E-49E8-BBA9-DBE86493BB39} diff --git a/dependencies.json b/dependencies.json index c16ae11dd..16b25451c 100644 --- a/dependencies.json +++ b/dependencies.json @@ -91,7 +91,7 @@ { "Kind": "NuGet", "Name": "Xamarin.Forms", - "Version": "2.3.4.231", + "Version": "2.4.0.38779", "DependentProjects": [ "Xamarin.Interactive.Forms.Android", "Xamarin.Interactive.Forms.iOS",