diff --git a/docs/interop.md b/docs/interop.md index 29848a6ef..ad28cad82 100644 --- a/docs/interop.md +++ b/docs/interop.md @@ -95,7 +95,7 @@ SetString(MarshalString.GetAbi(marshalStr)); ``` #### Interop Interfaces -**Note:** The CLR still supports marshaling COM (IUnknown), but not WinRT (IInspectable), interop interfaces. There are two approaches to marshaling IInspectable interfaces in C#/WinRT. +The CLR still supports marshaling COM (IUnknown), but not WinRT (IInspectable), interop interfaces. The Windows SDK projection provides definitions for several COM interop interfaces, including ***Windows.Storage.Streams.IBufferByteAccess***, ***WinRT.Interop.IWindowNative***, and ***WinRT.Interop.IInitializeWithWindow***. The Windows SDK projection also provides wrappers for all WinRT interop interfaces included in the Universal API Contract, such as ***Windows.Security.Credentials.UI.UserConsentVerifierInterop***. For custom or extension SDK interop interfaces, C#/WinRT supports two marshaling techniques. ##### Projected If possible, the interop interface should be defined in IDL and a C#/WinRT projection produced for it. This automatically generates all marshaling logic so that calling code can pass and receive projected types. This definition of `IUserConsentVerifierInterop` from one of our test components is an example of this: diff --git a/nuget/Microsoft.Windows.CsWinRT.nuspec b/nuget/Microsoft.Windows.CsWinRT.nuspec index 6c7ac3a44..cd6ee30d8 100644 --- a/nuget/Microsoft.Windows.CsWinRT.nuspec +++ b/nuget/Microsoft.Windows.CsWinRT.nuspec @@ -26,6 +26,7 @@ + diff --git a/nuget/Microsoft.Windows.CsWinRT.targets b/nuget/Microsoft.Windows.CsWinRT.targets index 8c6645369..cc10d2595 100644 --- a/nuget/Microsoft.Windows.CsWinRT.targets +++ b/nuget/Microsoft.Windows.CsWinRT.targets @@ -90,7 +90,12 @@ Copyright (C) Microsoft Corporation. All rights reserved. @(CsWinRTExcludeItems->'-exclude %(Identity)', ' ') @(CsWinRTIncludeItems->'-include %(Identity)', ' ') - + + $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', '..\metadata\WinRT.Interop.winmd')) + +-input $(CsWinRTInteropMetadata) +-include WinRT.Interop + $(CsWinRTCommandVerbosity) -target $(TargetFramework) @@ -98,6 +103,7 @@ $(CsWinRTWindowsMetadataInput) -input @(CsWinRTInputs->'"%(FullPath)"', ' ') -output "$(CsWinRTGeneratedFilesDir.TrimEnd('\'))" $(CsWinRTFilters) +$(CsWinRTIncludeWinRTInterop) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index eee4c5c30..8a93f61d9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -34,6 +34,7 @@ $([MSBuild]::NormalizeDirectory('$(SolutionDir)_build', '$(BuildPlatform)', '$(Configuration)')) $([MSBuild]::NormalizeDirectory('$(BuildOutDir)', 'cswinrt', 'bin')) $([MSBuild]::NormalizeDirectory('$(SolutionDir)_build', 'x86', '$(Configuration)', 'cswinrt', 'bin')) + $(CsWinRTPath)..\obj\merged\WinRT.Interop.winmd diff --git a/src/Projections/Test/Test.csproj b/src/Projections/Test/Test.csproj index ad43fb7d5..867f91ae4 100644 --- a/src/Projections/Test/Test.csproj +++ b/src/Projections/Test/Test.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net5.0 diff --git a/src/Projections/Windows/Windows.csproj b/src/Projections/Windows/Windows.csproj index f0e9d5265..982dfdcc6 100644 --- a/src/Projections/Windows/Windows.csproj +++ b/src/Projections/Windows/Windows.csproj @@ -1,35 +1,39 @@ - - - - netstandard2.0;net5.0 - x64;x86 - - - - - - - - - - --include Windows -# Exclude Windows.UI, Windows.UI.Text, Windows.UI.Xaml per Microsoft.Windows.SDK.WinUI.Contracts NuGet --include Windows.UI.Popups --exclude Windows.UI.Colors --exclude Windows.UI.IColors --exclude Windows.UI.ColorHelper --exclude Windows.UI.IColorHelper -#-exclude Windows.UI.Text (must include Windows.UI.Text to work around WinUI nuget issues) --exclude Windows.UI.Xaml --exclude Windows.ApplicationModel.Store.Preview -# Allow Windows.UI.Text, Windows.UI.Xaml types used in other namespaces --include Windows.UI.Text.FontStretch --include Windows.UI.Text.FontStyle --include Windows.UI.Text.FontWeight --include Windows.UI.Text.UnderlineType --include Windows.UI.Xaml.Media.Animation.ConditionallyIndependentlyAnimatableAttribute - - - - + + + + netstandard2.0;net5.0 + x64;x86 + + + + + + + + + + +-include Windows +# Exclude Windows.UI, Windows.UI.Text, Windows.UI.Xaml per Microsoft.Windows.SDK.WinUI.Contracts NuGet +-include Windows.UI.Popups +-exclude Windows.UI.Colors +-exclude Windows.UI.IColors +-exclude Windows.UI.ColorHelper +-exclude Windows.UI.IColorHelper +#-exclude Windows.UI.Text (must include Windows.UI.Text to work around WinUI nuget issues) +-exclude Windows.UI.Xaml +-exclude Windows.ApplicationModel.Store.Preview +# Allow Windows.UI.Text, Windows.UI.Xaml types used in other namespaces +-include Windows.UI.Text.FontStretch +-include Windows.UI.Text.FontStyle +-include Windows.UI.Text.FontWeight +-include Windows.UI.Text.UnderlineType +-include Windows.UI.Xaml.Media.Animation.ConditionallyIndependentlyAnimatableAttribute + + + + + TRACE;MANUAL_IUNKNOWN,UAC_VERSION_13 + + + diff --git a/src/Samples/WinUIDesktopSample/WinUIDesktopSample.csproj b/src/Samples/WinUIDesktopSample/WinUIDesktopSample.csproj index fc78a792c..7c54070c2 100644 --- a/src/Samples/WinUIDesktopSample/WinUIDesktopSample.csproj +++ b/src/Samples/WinUIDesktopSample/WinUIDesktopSample.csproj @@ -11,6 +11,8 @@ --> DoNotGenerateOtherProviders x86;x64 + true + false diff --git a/src/Tests/TestComponentCSharp/Directory.Build.props b/src/Tests/TestComponentCSharp/Directory.Build.props index dfb7b481e..8ee64c421 100644 --- a/src/Tests/TestComponentCSharp/Directory.Build.props +++ b/src/Tests/TestComponentCSharp/Directory.Build.props @@ -1,10 +1,15 @@ - + - - - - + + + true + + + + + + diff --git a/src/Tests/TestComponentCSharp/Directory.Build.targets b/src/Tests/TestComponentCSharp/Directory.Build.targets deleted file mode 100644 index e2ea5ceeb..000000000 --- a/src/Tests/TestComponentCSharp/Directory.Build.targets +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - CppWinRTMergeProjectWinMDInputsOverride;$(CppWinRTMergeProjectWinMDInputsDependsOn) - - - - - - - - - <_MdMergeDepth Condition="'$(CppWinRTNamespaceMergeDepth)' != ''">-n:$(CppWinRTNamespaceMergeDepth) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == ''">$(CppWinRTMergeDepth) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And '$(CppWinRTRootNamespaceAutoMerge)' == 'true'">-n:$(RootNamespace.Split('.').length) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And ('@(Page)' != '' Or '@(ApplicationDefinition)' != '')">-n:1 - <_MdMergeCommand>$(MdMergePath)mdmerge %40"$(IntDir)mdmerge.rsp" - - - - <_MdMergeParameters>@(CppWinRTMdMergeMetadataDirectories->'-metadata_dir "%(RelativeDir)."', ' ') - <_MdMergeParameters>$(_MdMergeParameters) @(CppWinRTMdMergeInputs->'-i "%(Identity)"', ' ') - <_MdMergeParameters>$(_MdMergeParameters) -o "$(CppWinRTMergedDir.TrimEnd('\'))" -partial $(_MdMergeDepth) - - - - - - - - - <_MdMergedOutput Remove="@(_MdMergedOutput)"/> - <_MdMergedOutput Include="$(CppWinRTMergedDir)*.winmd"/> - - - - - diff --git a/src/Tests/TestComponentCSharp/TestComponentCSharp.idl b/src/Tests/TestComponentCSharp/TestComponentCSharp.idl index 4ed99328c..0bdc432dc 100644 --- a/src/Tests/TestComponentCSharp/TestComponentCSharp.idl +++ b/src/Tests/TestComponentCSharp/TestComponentCSharp.idl @@ -423,13 +423,6 @@ namespace TestComponentCSharp CustomDisposableTest(); } - // IInspectable-based interop interface - [uuid(39E050C3-4E74-441A-8DC0-B81104DF949C)] - interface IUserConsentVerifierInterop - { - Object RequestVerificationForWindowAsync(UInt64 appWindow, String message, GUID riid); - } - [default_interface] runtimeclass CustomBindableVectorTest : Microsoft.UI.Xaml.Interop.IBindableVector { diff --git a/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj b/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj index 23a88346b..312f7793b 100644 --- a/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj +++ b/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj @@ -1,7 +1,7 @@ + - high true @@ -94,22 +94,21 @@ - - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + \ No newline at end of file diff --git a/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj.filters b/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj.filters index a268c04e7..8619e0939 100644 --- a/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj.filters +++ b/src/Tests/TestComponentCSharp/TestComponentCSharp.vcxproj.filters @@ -33,6 +33,5 @@ - \ No newline at end of file diff --git a/src/Tests/TestComponentCSharp/packages.config b/src/Tests/TestComponentCSharp/packages.config index 3e4579339..56121e4ac 100644 --- a/src/Tests/TestComponentCSharp/packages.config +++ b/src/Tests/TestComponentCSharp/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/src/Tests/UnitTest/ComInteropTests.cs b/src/Tests/UnitTest/ComInteropTests.cs new file mode 100644 index 000000000..1617db06b --- /dev/null +++ b/src/Tests/UnitTest/ComInteropTests.cs @@ -0,0 +1,117 @@ +using System; +using System.Runtime.InteropServices; +using Windows.ApplicationModel.DataTransfer.DragDrop.Core; +using Windows.Graphics.Printing; +using Windows.Media; +using Windows.Media.PlayTo; +using Windows.Security.Authentication.Web.Core; +using Windows.Security.Credentials; +using Windows.Security.Credentials.UI; +using Windows.UI.ApplicationSettings; +using Windows.UI.Input; +using Windows.UI.Input.Core; +using Windows.UI.Input.Spatial; +using Windows.UI.ViewManagement; +using Xunit; + +namespace UnitTest +{ + // Note: Many of the COM interop APIs cannot be easily tested without significant test setup. + // These cases either expect a runtime exception, or are compile-time only (skipped to validate types). + public class ComInteropTests + { + [Fact] + public void TestAccountsSettingsPane() + { + Assert.Throws(() => AccountsSettingsPaneInterop.GetForWindow(new IntPtr(0))); + Assert.Throws(() => AccountsSettingsPaneInterop.ShowAddAccountForWindowAsync(new IntPtr(0))); + Assert.Throws(() => AccountsSettingsPaneInterop.ShowManageAccountsForWindowAsync(new IntPtr(0))); + } + + [Fact] + public void TestDragDropManager() + { + Assert.Throws(() => DragDropManagerInterop.GetForWindow(new IntPtr(0))); + } + + [Fact] + public void TestInputPane() + { + Assert.Throws(() => InputPaneInterop.GetForWindow(new IntPtr(0))); + } + + [Fact] + public void TestPlayToManager() + { + Assert.Throws(() => PlayToManagerInterop.GetForWindow(new IntPtr(0))); + PlayToManagerInterop.ShowPlayToUIForWindow(new IntPtr(0)); + } + + [Fact] + public void TestPrintManager() + { + Assert.Throws(() => PrintManagerInterop.GetForWindow(new IntPtr(0))); + Assert.Throws(() => PrintManagerInterop.ShowPrintUIForWindowAsync(new IntPtr(0))); + } + + [Fact] + public void TestRadialControllerConfiguration() + { + Assert.Throws(() => RadialControllerConfigurationInterop.GetForWindow(new IntPtr(0))); + } + + // Skipping this test as it causes a hang + [Fact(Skip = "Compile-time only interop test")] + public void TestRadialControllerIndependentInputSource() + { + var radialControllerIndependentInputSource = RadialControllerIndependentInputSourceInterop.CreateForWindow(new IntPtr(0)); + Assert.IsType(radialControllerIndependentInputSource); + } + + // Skipping this test as it causes a hang + [Fact(Skip = "Compile-time only interop test")] + public void TestRadialControllerInterop() + { + var radialController = RadialControllerInterop.CreateForWindow(new IntPtr(0)); + Assert.IsType(radialController); + + } + + // Skipping this test as it raises non-catchable 'System.AccessViolationException' occurred in Windows.dll + [Fact(Skip = "Compile-time only interop test")] + public void TestSpatialInteractionManager() + { + Assert.Throws(() => SpatialInteractionManagerInterop.GetForWindow(new IntPtr(0))); + } + + // Skipping this test as it raises non-catchable 'System.AccessViolationException' occurred in Windows.dll + [Fact(Skip = "Compile-time only interop test")] + public void TestSystemMediaTransportControls() + { + Assert.Throws(() => SystemMediaTransportControlsInterop.GetForWindow(new IntPtr(0))); + } + + [Fact] + public void TestUIViewSettings() + { + Assert.Throws(() => UIViewSettingsInterop.GetForWindow(new IntPtr(0))); + } + + [Fact] + public void TestUserConsentVerifier() + { + var operation = UserConsentVerifierInterop.RequestVerificationForWindowAsync(new IntPtr(0), "message"); + Assert.NotNull(operation); + } + + [Fact] + public void TestWebAuthenticationCoreManager() + { + WebAccountProvider provider = new WebAccountProvider("id", "name", null); + WebTokenRequest webTokenRequest = new WebTokenRequest(provider); + Assert.Throws(() => WebAuthenticationCoreManagerInterop.RequestTokenForWindowAsync(new IntPtr(0), webTokenRequest)); + var webAccount = new WebAccount(provider, "user name", 0); + Assert.Throws(() => WebAuthenticationCoreManagerInterop.RequestTokenWithWebAccountForWindowAsync(new IntPtr(0), webTokenRequest, webAccount)); + } + } +} diff --git a/src/Tests/UnitTest/TestComponentCSharp_Tests.cs b/src/Tests/UnitTest/TestComponentCSharp_Tests.cs index c9e601cf9..7b9bda1bc 100644 --- a/src/Tests/UnitTest/TestComponentCSharp_Tests.cs +++ b/src/Tests/UnitTest/TestComponentCSharp_Tests.cs @@ -53,8 +53,8 @@ public TestCSharp() [Fact] public void TestEnums() - { - // Enums + { + // Enums var expectedEnum = EnumValue.Two; TestObject.EnumProperty = expectedEnum; Assert.Equal(expectedEnum, TestObject.EnumProperty); @@ -63,7 +63,7 @@ public void TestEnums() TestObject.EnumPropertyChanged += (object sender, EnumValue value) => Assert.Equal(expectedEnum, value); TestObject.RaiseEnumChanged(); - + var expectedEnumStruct = new EnumStruct() { value = EnumValue.Two }; TestObject.EnumStructProperty = expectedEnumStruct; Assert.Equal(expectedEnumStruct, TestObject.EnumStructProperty); @@ -71,16 +71,16 @@ public void TestEnums() TestObject.CallForEnumStruct(() => expectedEnumStruct); TestObject.EnumStructPropertyChanged += (object sender, EnumStruct value) => Assert.Equal(expectedEnumStruct, value); - TestObject.RaiseEnumStructChanged(); - + TestObject.RaiseEnumStructChanged(); + var expectedEnums = new EnumValue[] { EnumValue.One, EnumValue.Two }; - TestObject.EnumsProperty = expectedEnums; + TestObject.EnumsProperty = expectedEnums; Assert.Equal(expectedEnums, TestObject.EnumsProperty); TestObject.CallForEnums(() => expectedEnums); Assert.Equal(expectedEnums, TestObject.EnumsProperty); var expectedEnumStructs = new EnumStruct[] { new EnumStruct(EnumValue.One), new EnumStruct(EnumValue.Two) }; - TestObject.EnumStructsProperty = expectedEnumStructs; + TestObject.EnumStructsProperty = expectedEnumStructs; Assert.Equal(expectedEnumStructs, TestObject.EnumStructsProperty); TestObject.CallForEnumStructs(() => expectedEnumStructs); Assert.Equal(expectedEnumStructs, TestObject.EnumStructsProperty); @@ -94,7 +94,7 @@ public void TestEnums() TestObject.FlagPropertyChanged += (object sender, FlagValue value) => Assert.Equal(expectedFlag, value); TestObject.RaiseFlagChanged(); - + var expectedFlagStruct = new FlagStruct() { value = FlagValue.All }; TestObject.FlagStructProperty = expectedFlagStruct; Assert.Equal(expectedFlagStruct, TestObject.FlagStructProperty); @@ -102,16 +102,16 @@ public void TestEnums() TestObject.CallForFlagStruct(() => expectedFlagStruct); TestObject.FlagStructPropertyChanged += (object sender, FlagStruct value) => Assert.Equal(expectedFlagStruct, value); - TestObject.RaiseFlagStructChanged(); - + TestObject.RaiseFlagStructChanged(); + var expectedFlags = new FlagValue[] { FlagValue.One, FlagValue.All }; - TestObject.FlagsProperty = expectedFlags; + TestObject.FlagsProperty = expectedFlags; Assert.Equal(expectedFlags, TestObject.FlagsProperty); TestObject.CallForFlags(() => expectedFlags); Assert.Equal(expectedFlags, TestObject.FlagsProperty); var expectedFlagStructs = new FlagStruct[] { new FlagStruct(FlagValue.One), new FlagStruct(FlagValue.All) }; - TestObject.FlagStructsProperty = expectedFlagStructs; + TestObject.FlagStructsProperty = expectedFlagStructs; Assert.Equal(expectedFlagStructs, TestObject.FlagStructsProperty); TestObject.CallForFlagStructs(() => expectedFlagStructs); Assert.Equal(expectedFlagStructs, TestObject.FlagStructsProperty); @@ -424,11 +424,11 @@ public void TestStreamWriteAsync() Assert.True(InvokeStreamWriteAsync().Wait(1000)); } - [Fact] - public void TestAsStream() - { - using InMemoryRandomAccessStream winrtStream = new InMemoryRandomAccessStream(); - using Stream normalStream = winrtStream.AsStream(); + [Fact] + public void TestAsStream() + { + using InMemoryRandomAccessStream winrtStream = new InMemoryRandomAccessStream(); + using Stream normalStream = winrtStream.AsStream(); using var memoryStream = new MemoryStream(); normalStream.CopyTo(memoryStream); } @@ -759,26 +759,26 @@ public void TestObjectCasting() var objects = new List() { new ManagedType(), new ManagedType() }; var query = from item in objects select item; - TestObject.ObjectIterableProperty = query; - - TestObject.ObjectProperty = "test"; - Assert.Equal("test", TestObject.ObjectProperty); - - var objectArray = new ManagedType[] { new ManagedType(), new ManagedType() }; - TestObject.ObjectIterableProperty = objectArray; - Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(objectArray)); - - var strArray = new string[] { "str1", "str2", "str3" }; - TestObject.ObjectIterableProperty = strArray; - Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(strArray)); - - var uriArray = new Uri[] { new Uri("http://aka.ms/cswinrt"), new Uri("http://github.com") }; - TestObject.ObjectIterableProperty = uriArray; - Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(uriArray)); - - var objectUriArray = new object[] { new Uri("http://github.com") }; - TestObject.ObjectIterableProperty = objectUriArray; - Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(objectUriArray)); + TestObject.ObjectIterableProperty = query; + + TestObject.ObjectProperty = "test"; + Assert.Equal("test", TestObject.ObjectProperty); + + var objectArray = new ManagedType[] { new ManagedType(), new ManagedType() }; + TestObject.ObjectIterableProperty = objectArray; + Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(objectArray)); + + var strArray = new string[] { "str1", "str2", "str3" }; + TestObject.ObjectIterableProperty = strArray; + Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(strArray)); + + var uriArray = new Uri[] { new Uri("http://aka.ms/cswinrt"), new Uri("http://github.com") }; + TestObject.ObjectIterableProperty = uriArray; + Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(uriArray)); + + var objectUriArray = new object[] { new Uri("http://github.com") }; + TestObject.ObjectIterableProperty = objectUriArray; + Assert.True(TestObject.ObjectIterableProperty.SequenceEqual(objectUriArray)); } [Fact] @@ -1158,12 +1158,6 @@ public unsafe void TestFactoryCast() var staticFactory = ComImports.As(); staticFactory.ToString(out hstr); Assert.Equal("ComImports", MarshalString.FromAbi(hstr)); - - // IInspectable-based (projected) interop interface - var interop = Windows.Security.Credentials.UI.UserConsentVerifier.As(); - var guid = GuidGenerator.CreateIID(typeof(IAsyncOperation)); - var operation = (IAsyncOperation)interop.RequestVerificationForWindowAsync(0, "message", guid); - Assert.NotNull(operation); } [Fact] @@ -1379,59 +1373,59 @@ public void TestSimpleCCWs() var managedProperties = new ManagedProperties(42); TestObject.CopyProperties(managedProperties); Assert.Equal(managedProperties.ReadWriteProperty, TestObject.ReadWriteProperty); - } - + } + [Fact] public void TestCCWMarshaler() { Guid IID_IMarshal = new Guid("00000003-0000-0000-c000-000000000046"); - var managedProperties = new ManagedProperties(42); + var managedProperties = new ManagedProperties(42); IObjectReference ccw = MarshalInterface.CreateMarshaler(managedProperties); ccw.TryAs(IID_IMarshal, out var marshalCCW); - Assert.NotNull(marshalCCW); - - var array = new byte[] { 0x01 }; - var buff = array.AsBuffer(); + Assert.NotNull(marshalCCW); + + var array = new byte[] { 0x01 }; + var buff = array.AsBuffer(); IObjectReference ccw2 = MarshalInterface.CreateMarshaler(buff); ccw2.TryAs(IID_IMarshal, out var marshalCCW2); - Assert.NotNull(marshalCCW2); - } - -#if !NETCOREAPP2_0 - [Fact] - public void TestDelegateCCWMarshaler() - { - CreateAndValidateStreamedFile().Wait(); - } - - private async Task CreateAndValidateStreamedFile() - { - var storageFile = await StorageFile.CreateStreamedFileAsync("CreateAndValidateStreamedFile.txt", StreamedFileWriter, null); - using var inputStream = await storageFile.OpenSequentialReadAsync(); - using var stream = inputStream.AsStreamForRead(); - byte[] buff = new byte[50]; - var numRead = stream.Read(buff, 0, 50); - Assert.True(numRead > 0); - var result = System.Text.Encoding.Default.GetString(buff, 0, numRead).TrimEnd(null); - Assert.Equal("Success!", result); - } - - private static async void StreamedFileWriter(StreamedFileDataRequest request) - { - try - { - using (var stream = request.AsStreamForWrite()) - using (var streamWriter = new StreamWriter(stream)) - { - await streamWriter.WriteLineAsync("Success!"); - } - request.Dispose(); - } - catch (Exception) - { - request.FailAndClose(StreamedFileFailureMode.Incomplete); - } - } + Assert.NotNull(marshalCCW2); + } + +#if !NETCOREAPP2_0 + [Fact] + public void TestDelegateCCWMarshaler() + { + CreateAndValidateStreamedFile().Wait(); + } + + private async Task CreateAndValidateStreamedFile() + { + var storageFile = await StorageFile.CreateStreamedFileAsync("CreateAndValidateStreamedFile.txt", StreamedFileWriter, null); + using var inputStream = await storageFile.OpenSequentialReadAsync(); + using var stream = inputStream.AsStreamForRead(); + byte[] buff = new byte[50]; + var numRead = stream.Read(buff, 0, 50); + Assert.True(numRead > 0); + var result = System.Text.Encoding.Default.GetString(buff, 0, numRead).TrimEnd(null); + Assert.Equal("Success!", result); + } + + private static async void StreamedFileWriter(StreamedFileDataRequest request) + { + try + { + using (var stream = request.AsStreamForWrite()) + using (var streamWriter = new StreamWriter(stream)) + { + await streamWriter.WriteLineAsync("Success!"); + } + request.Dispose(); + } + catch (Exception) + { + request.FailAndClose(StreamedFileFailureMode.Incomplete); + } + } #endif [Fact] @@ -1735,11 +1729,11 @@ public void TestPointTypeMapping() Assert.True(TestObject.PointProperty == pt); Assert.Equal(pt, TestObject.GetPointReference().Value); - var vector2 = TestObject.PointProperty.ToVector2(); + var vector2 = TestObject.PointProperty.ToVector2(); Assert.Equal(pt.X, vector2.X); Assert.Equal(pt.Y, vector2.Y); - TestObject.PointProperty = vector2.ToPoint(); + TestObject.PointProperty = vector2.ToPoint(); Assert.Equal(pt.X, TestObject.PointProperty.X); Assert.Equal(pt.Y, TestObject.PointProperty.Y); } @@ -1763,13 +1757,13 @@ public void TestSizeTypeMapping() TestObject.SizeProperty = size; Assert.Equal(size.Height, TestObject.SizeProperty.Height); Assert.Equal(size.Width, TestObject.SizeProperty.Width); - Assert.True(TestObject.SizeProperty == size); - - var vector2 = TestObject.SizeProperty.ToVector2(); + Assert.True(TestObject.SizeProperty == size); + + var vector2 = TestObject.SizeProperty.ToVector2(); Assert.Equal(size.Width, vector2.X); Assert.Equal(size.Height, vector2.Y); - TestObject.SizeProperty = vector2.ToSize(); + TestObject.SizeProperty = vector2.ToSize(); Assert.Equal(size.Width, TestObject.SizeProperty.Width); Assert.Equal(size.Height, TestObject.SizeProperty.Height); } @@ -2035,12 +2029,12 @@ public void TestDateTimeMapping() } [Fact] - public void TestDateTimeMappingNegative() - { - var time = new DateTimeOffset(1501, 1, 1, 0, 0, 0, TimeSpan.Zero); - TestObject.DateTimeProperty = time; - Assert.Equal(time, TestObject.DateTimeProperty); - Assert.Equal(time, TestObject.GetDateTimeProperty().Value); + public void TestDateTimeMappingNegative() + { + var time = new DateTimeOffset(1501, 1, 1, 0, 0, 0, TimeSpan.Zero); + TestObject.DateTimeProperty = time; + Assert.Equal(time, TestObject.DateTimeProperty); + Assert.Equal(time, TestObject.GetDateTimeProperty().Value); } [Fact] @@ -2247,15 +2241,15 @@ public void AcquireObject() nonAgileObject.Commands.Add(new Windows.UI.Popups.UICommand("test")); nonAgileObject.Commands.Add(new Windows.UI.Popups.UICommand("test2")); Assert.ThrowsAny(() => nonAgileObject.As()); - + agileReference = nonAgileObject.AsAgile(); objectAcquired.Set(); - valueAcquired.WaitOne(); - - // Object gets proxied to the apartment. - Assert.Equal(2, proxyObject.Commands.Count); - agileReference.Dispose(); - + valueAcquired.WaitOne(); + + // Object gets proxied to the apartment. + Assert.Equal(2, proxyObject.Commands.Count); + agileReference.Dispose(); + proxyObject2 = agileReference2.Get(); } @@ -2263,19 +2257,19 @@ public void CheckValue() { objectAcquired.WaitOne(); Assert.Equal(ApartmentState.MTA, Thread.CurrentThread.GetApartmentState()); - proxyObject = agileReference.Get(); - Assert.Equal(2, proxyObject.Commands.Count); - + proxyObject = agileReference.Get(); + Assert.Equal(2, proxyObject.Commands.Count); + nonAgileObject2 = new Windows.UI.Popups.PopupMenu(); agileReference2 = nonAgileObject2.AsAgile(); - + valueAcquired.Set(); } - public void CallProxyObject() - { - // Call to the proxy object after the apartment is gone should throw. - Assert.ThrowsAny(() => proxyObject2.Commands); + public void CallProxyObject() + { + // Call to the proxy object after the apartment is gone should throw. + Assert.ThrowsAny(() => proxyObject2.Commands); } private Windows.UI.Popups.PopupMenu nonAgileObject, nonAgileObject2; @@ -2298,11 +2292,11 @@ public void TestNonAgileObjectCall() mtaThread.SetApartmentState(ApartmentState.MTA); mtaThread.Start(); mtaThread.Join(); - staThread.Join(); - - // Spin another STA thread after the other 2 threads are done and try to - // access one of the proxied objects. They should fail as there is no context - // to switch to in order to marshal it to the current apartment. + staThread.Join(); + + // Spin another STA thread after the other 2 threads are done and try to + // access one of the proxied objects. They should fail as there is no context + // to switch to in order to marshal it to the current apartment. Thread anotherStaThread = new Thread(new ThreadStart(caller.CallProxyObject)); anotherStaThread.SetApartmentState(ApartmentState.STA); anotherStaThread.Start(); @@ -2378,7 +2372,7 @@ static void TestImports() GC.Collect(); GC.WaitForPendingFinalizers(); Assert.Equal(0, ComImports.NumObjects); - } + } [Fact] public void TestInterfaceObjectMarshalling() @@ -2402,133 +2396,133 @@ public void TestNonProjectedRuntimeClass() } [Fact(Skip="Operation not supported")] - public void TestIBindableIterator() - { - CustomBindableIteratorTest bindableIterator = new CustomBindableIteratorTest(); - Assert.True(bindableIterator.MoveNext()); - Assert.True(bindableIterator.HasCurrent); - Assert.Equal(27861, bindableIterator.Current); - } - - [Fact] - public void TestIDisposable() - { - CustomDisposableTest disposable = new CustomDisposableTest(); - disposable.Dispose(); - } - - [Fact] - public void TestIBindableVector() - { - CustomBindableVectorTest vector = new CustomBindableVectorTest(); - Assert.NotNull(vector); - } - - [Fact] - public void TestCovariance() - { - var listOfListOfPoints = new List>() { - new List{ new Point(1, 1), new Point(1, 2), new Point(1, 3) }, - new List{ new Point(2, 1), new Point(2, 2), new Point(2, 3) }, - new List{ new Point(3, 1), new Point(3, 2), new Point(3, 3) } - }; - TestObject.IterableOfPointIterablesProperty = listOfListOfPoints; - Assert.True(TestObject.IterableOfPointIterablesProperty.SequenceEqual(listOfListOfPoints)); - - var listOfListOfUris = new List>() { - new List{ new Uri("http://aka.ms/cswinrt"), new Uri("http://github.com") }, - new List{ new Uri("http://aka.ms/cswinrt") }, - new List{ new Uri("http://aka.ms/cswinrt"), new Uri("http://microsoft.com") } - }; - TestObject.IterableOfObjectIterablesProperty = listOfListOfUris; - Assert.True(TestObject.IterableOfObjectIterablesProperty.SequenceEqual(listOfListOfUris)); - } - - // Ensure that event subscription state is properly cached to enable later unsubscribes - [Fact] - public void TestEventSourceCaching() - { - bool eventCalled = false; - void Class_StaticIntPropertyChanged(object sender, int e) => eventCalled = (e == 3); - - // Test static codegen-based EventSource caching - Class.StaticIntPropertyChanged += Class_StaticIntPropertyChanged; - GC.Collect(2, GCCollectionMode.Forced, true); - GC.WaitForPendingFinalizers(); - Class.StaticIntPropertyChanged -= Class_StaticIntPropertyChanged; - Class.StaticIntProperty = 3; - Assert.False(eventCalled); - Class.StaticIntPropertyChanged += Class_StaticIntPropertyChanged; - GC.Collect(2, GCCollectionMode.Forced, true); - GC.WaitForPendingFinalizers(); - Class.StaticIntProperty = 3; - Assert.True(eventCalled); - - // Test dynamic WeakRef-based EventSource caching - eventCalled = false; + public void TestIBindableIterator() + { + CustomBindableIteratorTest bindableIterator = new CustomBindableIteratorTest(); + Assert.True(bindableIterator.MoveNext()); + Assert.True(bindableIterator.HasCurrent); + Assert.Equal(27861, bindableIterator.Current); + } + + [Fact] + public void TestIDisposable() + { + CustomDisposableTest disposable = new CustomDisposableTest(); + disposable.Dispose(); + } + + [Fact] + public void TestIBindableVector() + { + CustomBindableVectorTest vector = new CustomBindableVectorTest(); + Assert.NotNull(vector); + } + + [Fact] + public void TestCovariance() + { + var listOfListOfPoints = new List>() { + new List{ new Point(1, 1), new Point(1, 2), new Point(1, 3) }, + new List{ new Point(2, 1), new Point(2, 2), new Point(2, 3) }, + new List{ new Point(3, 1), new Point(3, 2), new Point(3, 3) } + }; + TestObject.IterableOfPointIterablesProperty = listOfListOfPoints; + Assert.True(TestObject.IterableOfPointIterablesProperty.SequenceEqual(listOfListOfPoints)); + + var listOfListOfUris = new List>() { + new List{ new Uri("http://aka.ms/cswinrt"), new Uri("http://github.com") }, + new List{ new Uri("http://aka.ms/cswinrt") }, + new List{ new Uri("http://aka.ms/cswinrt"), new Uri("http://microsoft.com") } + }; + TestObject.IterableOfObjectIterablesProperty = listOfListOfUris; + Assert.True(TestObject.IterableOfObjectIterablesProperty.SequenceEqual(listOfListOfUris)); + } + + // Ensure that event subscription state is properly cached to enable later unsubscribes + [Fact] + public void TestEventSourceCaching() + { + bool eventCalled = false; + void Class_StaticIntPropertyChanged(object sender, int e) => eventCalled = (e == 3); + + // Test static codegen-based EventSource caching + Class.StaticIntPropertyChanged += Class_StaticIntPropertyChanged; + GC.Collect(2, GCCollectionMode.Forced, true); + GC.WaitForPendingFinalizers(); + Class.StaticIntPropertyChanged -= Class_StaticIntPropertyChanged; + Class.StaticIntProperty = 3; + Assert.False(eventCalled); + Class.StaticIntPropertyChanged += Class_StaticIntPropertyChanged; + GC.Collect(2, GCCollectionMode.Forced, true); + GC.WaitForPendingFinalizers(); + Class.StaticIntProperty = 3; + Assert.True(eventCalled); + + // Test dynamic WeakRef-based EventSource caching + eventCalled = false; static void Subscribe(EventHandler handler) => Singleton.Instance.IntPropertyChanged += handler; static void Unsubscribe(EventHandler handler) => Singleton.Instance.IntPropertyChanged -= handler; static void Assign(int value) => Singleton.Instance.IntProperty = value; - Subscribe(Class_StaticIntPropertyChanged); - GC.Collect(2, GCCollectionMode.Forced, true); - GC.WaitForPendingFinalizers(); - Unsubscribe(Class_StaticIntPropertyChanged); - Assign(3); - Assert.False(eventCalled); - Subscribe(Class_StaticIntPropertyChanged); - GC.Collect(2, GCCollectionMode.Forced, true); - GC.WaitForPendingFinalizers(); - Assign(3); - Assert.True(eventCalled); - } - + Subscribe(Class_StaticIntPropertyChanged); + GC.Collect(2, GCCollectionMode.Forced, true); + GC.WaitForPendingFinalizers(); + Unsubscribe(Class_StaticIntPropertyChanged); + Assign(3); + Assert.False(eventCalled); + Subscribe(Class_StaticIntPropertyChanged); + GC.Collect(2, GCCollectionMode.Forced, true); + GC.WaitForPendingFinalizers(); + Assign(3); + Assert.True(eventCalled); + } + #if NET5_0 - [TestComponentCSharp.Warning] // NO warning CA1416 - class WarningManaged { }; - - class WarningSubclass : WarningClass - { - void InvokeOverridableWarnings() - { - WarningOverridableMethod(); // warning CA1416 - WarningOverridableProperty = 0; // warning CA1416 - // see https://github.com/microsoft/cppwinrt/issues/782 - //WarningOverridableEvent += (object s, Int32 v) => { }; // warning CA1416 - } - } - - // Manual for now - verify that all APIs targeting 19041 generate a warning - private void TestSupportedOSPlatformWarnings() - { - // Types - var a = new WarningAttribute(); // warning CA1416 - Assert.NotNull(a); - var w = new WarningStruct{ i32 = 0 }; // warning CA1416 - Assert.Equal(0, w.i32); // warning CA1416 - var v = WarningEnum.Value; - Assert.NotEqual(WarningEnum.WarningValue, v); // warning CA1416 - - // Members - var o = new WarningClass(); // warning CA1416 - o = new WarningClass(WarningEnum.Value); // warning CA1416 - o.WarningMethod(); // warning CA1416 - var p = o.WarningProperty; // warning CA1416 - o.WarningProperty = 0; // warning CA1416 - p = o.WarningPropertySetter; - o.WarningPropertySetter = 0; // warning CA1416 - o.WarningEvent += (object s, Int32 v) => { }; // warning CA1416 - o.WarningInterfaceMethod(); // warning CA1416 - p = o.WarningInterfaceProperty; // warning CA1416 - o.WarningInterfaceProperty = 0; // warning CA1416 - p = o.WarningInterfacePropertySetter; - o.WarningInterfacePropertySetter = 0; // warning CA1416 - o.WarningInterfaceEvent += (object s, Int32 v) => { }; // warning CA1416 - - // Attributed statics - WarningStatic.WarningMethod(); // warning CA1416 - WarningStatic.WarningProperty = 0; // warning CA1416 - WarningStatic.WarningEvent += (object s, Int32 v) => { }; // warning CA1416 + [TestComponentCSharp.Warning] // NO warning CA1416 + class WarningManaged { }; + + class WarningSubclass : WarningClass + { + void InvokeOverridableWarnings() + { + WarningOverridableMethod(); // warning CA1416 + WarningOverridableProperty = 0; // warning CA1416 + // see https://github.com/microsoft/cppwinrt/issues/782 + //WarningOverridableEvent += (object s, Int32 v) => { }; // warning CA1416 + } + } + + // Manual for now - verify that all APIs targeting 19041 generate a warning + private void TestSupportedOSPlatformWarnings() + { + // Types + var a = new WarningAttribute(); // warning CA1416 + Assert.NotNull(a); + var w = new WarningStruct{ i32 = 0 }; // warning CA1416 + Assert.Equal(0, w.i32); // warning CA1416 + var v = WarningEnum.Value; + Assert.NotEqual(WarningEnum.WarningValue, v); // warning CA1416 + + // Members + var o = new WarningClass(); // warning CA1416 + o = new WarningClass(WarningEnum.Value); // warning CA1416 + o.WarningMethod(); // warning CA1416 + var p = o.WarningProperty; // warning CA1416 + o.WarningProperty = 0; // warning CA1416 + p = o.WarningPropertySetter; + o.WarningPropertySetter = 0; // warning CA1416 + o.WarningEvent += (object s, Int32 v) => { }; // warning CA1416 + o.WarningInterfaceMethod(); // warning CA1416 + p = o.WarningInterfaceProperty; // warning CA1416 + o.WarningInterfaceProperty = 0; // warning CA1416 + p = o.WarningInterfacePropertySetter; + o.WarningInterfacePropertySetter = 0; // warning CA1416 + o.WarningInterfaceEvent += (object s, Int32 v) => { }; // warning CA1416 + + // Attributed statics + WarningStatic.WarningMethod(); // warning CA1416 + WarningStatic.WarningProperty = 0; // warning CA1416 + WarningStatic.WarningEvent += (object s, Int32 v) => { }; // warning CA1416 } #endif } -} +} diff --git a/src/WinRT.Runtime/WinRT.Runtime.csproj b/src/WinRT.Runtime/WinRT.Runtime.csproj index 897d91af8..4a61f108a 100644 --- a/src/WinRT.Runtime/WinRT.Runtime.csproj +++ b/src/WinRT.Runtime/WinRT.Runtime.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/cswinrt.sln b/src/cswinrt.sln index 9197abf9a..dcdc88368 100644 --- a/src/cswinrt.sln +++ b/src/cswinrt.sln @@ -101,202 +101,332 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AuthoringWinUITest", "Tests EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|ARM.ActiveCfg = Debug|Win32 + {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|ARM64.ActiveCfg = Debug|Win32 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|x64.ActiveCfg = Debug|x64 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|x64.Build.0 = Debug|x64 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|x86.ActiveCfg = Debug|Win32 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Debug|x86.Build.0 = Debug|Win32 + {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|ARM.ActiveCfg = Release|Win32 + {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|ARM64.ActiveCfg = Release|Win32 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|x64.ActiveCfg = Release|x64 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|x64.Build.0 = Release|x64 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|x86.ActiveCfg = Release|Win32 {7E3A9AB3-8CBB-4B9C-BA76-0FE7108DCAEB}.Release|x86.Build.0 = Release|Win32 + {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|ARM.ActiveCfg = Debug|x86 + {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|ARM64.ActiveCfg = Debug|x86 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|x64.ActiveCfg = Debug|x64 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|x64.Build.0 = Debug|x64 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|x86.ActiveCfg = Debug|x86 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Debug|x86.Build.0 = Debug|x86 + {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|ARM.ActiveCfg = Release|x86 + {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|ARM64.ActiveCfg = Release|x86 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|x64.ActiveCfg = Release|x64 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|x64.Build.0 = Release|x64 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|x86.ActiveCfg = Release|x86 {9A9F52CA-F624-43A4-B5EF-C50861F584C2}.Release|x86.Build.0 = Release|x86 + {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|ARM.ActiveCfg = Debug|Win32 + {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|ARM64.ActiveCfg = Debug|Win32 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|x64.ActiveCfg = Debug|x64 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|x64.Build.0 = Debug|x64 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|x86.ActiveCfg = Debug|Win32 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Debug|x86.Build.0 = Debug|Win32 + {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|ARM.ActiveCfg = Release|Win32 + {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|ARM64.ActiveCfg = Release|Win32 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|x64.ActiveCfg = Release|x64 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|x64.Build.0 = Release|x64 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|x86.ActiveCfg = Release|Win32 {6ACFD2B2-E8AA-4CD4-AAD8-213CE8BB2637}.Release|x86.Build.0 = Release|Win32 + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|ARM.ActiveCfg = Debug|ARM + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|ARM.Build.0 = Debug|ARM + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|ARM64.ActiveCfg = Debug|Win32 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|x64.ActiveCfg = Debug|x64 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|x64.Build.0 = Debug|x64 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|x86.ActiveCfg = Debug|Win32 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Debug|x86.Build.0 = Debug|Win32 + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|ARM.ActiveCfg = Release|ARM + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|ARM.Build.0 = Release|ARM + {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|ARM64.ActiveCfg = Release|Win32 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|x64.ActiveCfg = Release|x64 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|x64.Build.0 = Release|x64 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|x86.ActiveCfg = Release|Win32 {2954F343-85A7-46F5-A3F3-F106FDD13900}.Release|x86.Build.0 = Release|Win32 + {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|ARM.ActiveCfg = Debug|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|ARM.Build.0 = Debug|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|ARM64.Build.0 = Debug|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|x64.ActiveCfg = Debug|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|x64.Build.0 = Debug|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|x86.ActiveCfg = Debug|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Debug|x86.Build.0 = Debug|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Release|ARM.ActiveCfg = Release|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Release|ARM.Build.0 = Release|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Release|ARM64.ActiveCfg = Release|Any CPU + {25244CED-966E-45F2-9711-1F51E951FF89}.Release|ARM64.Build.0 = Release|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Release|x64.ActiveCfg = Release|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Release|x64.Build.0 = Release|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Release|x86.ActiveCfg = Release|Any CPU {25244CED-966E-45F2-9711-1F51E951FF89}.Release|x86.Build.0 = Release|Any CPU + {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|ARM.ActiveCfg = Debug|x86 + {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|ARM64.ActiveCfg = Debug|x86 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|x64.ActiveCfg = Debug|x64 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|x64.Build.0 = Debug|x64 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|x86.ActiveCfg = Debug|x86 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Debug|x86.Build.0 = Debug|x86 + {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|ARM.ActiveCfg = Release|x86 + {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|ARM64.ActiveCfg = Release|x86 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|x64.ActiveCfg = Release|x64 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|x64.Build.0 = Release|x64 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|x86.ActiveCfg = Release|x86 {8E6FBCB2-B0C1-4E92-8AEB-2A11564E6E0D}.Release|x86.Build.0 = Release|x86 + {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|ARM.ActiveCfg = Debug|x86 + {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|ARM64.ActiveCfg = Debug|x86 {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|x64.ActiveCfg = Debug|x64 {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|x64.Build.0 = Debug|x64 {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|x86.ActiveCfg = Debug|x86 {C6D580C5-7037-4733-B933-916FF400AFE2}.Debug|x86.Build.0 = Debug|x86 + {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|ARM.ActiveCfg = Release|x86 + {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|ARM64.ActiveCfg = Release|x86 {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|x64.ActiveCfg = Release|x64 {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|x64.Build.0 = Release|x64 {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|x86.ActiveCfg = Release|x86 {C6D580C5-7037-4733-B933-916FF400AFE2}.Release|x86.Build.0 = Release|x86 + {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|ARM.ActiveCfg = Debug|x86 + {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|ARM64.ActiveCfg = Debug|x86 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|x64.ActiveCfg = Debug|x64 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|x64.Build.0 = Debug|x64 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|x86.ActiveCfg = Debug|x86 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Debug|x86.Build.0 = Debug|x86 + {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|ARM.ActiveCfg = Release|x86 + {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|ARM64.ActiveCfg = Release|x86 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|x64.ActiveCfg = Release|x64 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|x64.Build.0 = Release|x64 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|x86.ActiveCfg = Release|x86 {FFA9A78B-F53F-43EE-AF87-24A80F4C330A}.Release|x86.Build.0 = Release|x86 + {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|ARM.ActiveCfg = Debug|x86 + {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|ARM64.ActiveCfg = Debug|x86 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|x64.ActiveCfg = Debug|x64 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|x64.Build.0 = Debug|x64 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|x86.ActiveCfg = Debug|x86 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Debug|x86.Build.0 = Debug|x86 + {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|ARM.ActiveCfg = Release|x86 + {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|ARM64.ActiveCfg = Release|x86 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|x64.ActiveCfg = Release|x64 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|x64.Build.0 = Release|x64 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|x86.ActiveCfg = Release|x86 {0A991D5F-BFEE-4D2F-9AAD-6AD06470A5DF}.Release|x86.Build.0 = Release|x86 + {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Debug|ARM.ActiveCfg = Debug|x86 + {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Debug|ARM64.ActiveCfg = Debug|x86 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Debug|x64.ActiveCfg = Debug|x64 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Debug|x64.Build.0 = Debug|x64 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Debug|x86.ActiveCfg = Debug|x86 + {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Release|ARM.ActiveCfg = Release|x86 + {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Release|ARM64.ActiveCfg = Release|x86 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Release|x64.ActiveCfg = Release|x64 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Release|x64.Build.0 = Release|x64 {B34C96F4-3660-4B2D-8ABD-A4B428166DC7}.Release|x86.ActiveCfg = Release|x86 + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|ARM.ActiveCfg = Debug|ARM + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|ARM.Build.0 = Debug|ARM + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|ARM64.ActiveCfg = Debug|Win32 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|x64.ActiveCfg = Debug|x64 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|x64.Build.0 = Debug|x64 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|x86.ActiveCfg = Debug|Win32 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Debug|x86.Build.0 = Debug|Win32 + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|ARM.ActiveCfg = Release|ARM + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|ARM.Build.0 = Release|ARM + {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|ARM64.ActiveCfg = Release|Win32 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|x64.ActiveCfg = Release|x64 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|x64.Build.0 = Release|x64 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|x86.ActiveCfg = Release|Win32 {78D85F23-7CB1-44A1-9238-6DF2C76754E4}.Release|x86.Build.0 = Release|Win32 + {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|ARM.ActiveCfg = Debug|x86 + {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|ARM64.ActiveCfg = Debug|x86 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|x64.ActiveCfg = Debug|x64 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|x64.Build.0 = Debug|x64 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|x86.ActiveCfg = Debug|x86 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Debug|x86.Build.0 = Debug|x86 + {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|ARM.ActiveCfg = Release|x86 + {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|ARM64.ActiveCfg = Release|x86 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|x64.ActiveCfg = Release|x64 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|x64.Build.0 = Release|x64 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|x86.ActiveCfg = Release|x86 {03EEF460-2F10-4FBE-AFFA-53477D3FC8D5}.Release|x86.Build.0 = Release|x86 + {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|ARM.ActiveCfg = Debug|Win32 + {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|ARM64.ActiveCfg = Debug|Win32 {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|x64.ActiveCfg = Debug|x64 {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|x64.Build.0 = Debug|x64 {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|x86.ActiveCfg = Debug|Win32 {7E33BCB7-19C5-4061-981D-BA695322708A}.Debug|x86.Build.0 = Debug|Win32 + {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|ARM.ActiveCfg = Release|Win32 + {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|ARM64.ActiveCfg = Release|Win32 {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|x64.ActiveCfg = Release|x64 {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|x64.Build.0 = Release|x64 {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|x86.ActiveCfg = Release|Win32 {7E33BCB7-19C5-4061-981D-BA695322708A}.Release|x86.Build.0 = Release|Win32 + {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|ARM.ActiveCfg = Debug|Win32 + {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|ARM64.ActiveCfg = Debug|Win32 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|x64.ActiveCfg = Debug|x64 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|x64.Build.0 = Debug|x64 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|x86.ActiveCfg = Debug|Win32 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Debug|x86.Build.0 = Debug|Win32 + {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|ARM.ActiveCfg = Release|Win32 + {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|ARM64.ActiveCfg = Release|Win32 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|x64.ActiveCfg = Release|x64 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|x64.Build.0 = Release|x64 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|x86.ActiveCfg = Release|Win32 {B511B7C9-C8E2-47ED-A0D1-538C00747D30}.Release|x86.Build.0 = Release|Win32 + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|ARM.Build.0 = Debug|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|ARM64.Build.0 = Debug|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|x64.ActiveCfg = Debug|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|x64.Build.0 = Debug|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|x86.ActiveCfg = Debug|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Debug|x86.Build.0 = Debug|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|ARM.ActiveCfg = Release|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|ARM.Build.0 = Release|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|ARM64.ActiveCfg = Release|Any CPU + {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|ARM64.Build.0 = Release|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|x64.ActiveCfg = Release|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|x64.Build.0 = Release|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|x86.ActiveCfg = Release|Any CPU {0BB8F82D-874E-45AA-BCA3-20CE0562164A}.Release|x86.Build.0 = Release|Any CPU + {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|ARM.ActiveCfg = Debug|x86 + {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|ARM64.ActiveCfg = Debug|x86 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|x64.ActiveCfg = Debug|x64 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|x64.Build.0 = Debug|x64 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|x86.ActiveCfg = Debug|x86 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Debug|x86.Build.0 = Debug|x86 + {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|ARM.ActiveCfg = Release|x86 + {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|ARM64.ActiveCfg = Release|x86 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|x64.ActiveCfg = Release|x64 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|x64.Build.0 = Release|x64 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|x86.ActiveCfg = Release|x86 {EF3326B5-716F-41D2-AB30-4EFAB30955E2}.Release|x86.Build.0 = Release|x86 + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|ARM.Build.0 = Debug|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|ARM64.Build.0 = Debug|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|x64.ActiveCfg = Debug|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|x64.Build.0 = Debug|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|x86.ActiveCfg = Debug|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Debug|x86.Build.0 = Debug|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|ARM.ActiveCfg = Release|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|ARM.Build.0 = Release|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|ARM64.ActiveCfg = Release|Any CPU + {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|ARM64.Build.0 = Release|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|x64.ActiveCfg = Release|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|x64.Build.0 = Release|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|x86.ActiveCfg = Release|Any CPU {E0C26D3A-504A-4826-BAE2-DE775F865B2A}.Release|x86.Build.0 = Release|Any CPU + {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|ARM.ActiveCfg = Debug|x86 + {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|ARM64.ActiveCfg = Debug|x86 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|x64.ActiveCfg = Debug|x64 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|x64.Build.0 = Debug|x64 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|x86.ActiveCfg = Debug|x86 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Debug|x86.Build.0 = Debug|x86 + {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|ARM.ActiveCfg = Release|x86 + {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|ARM64.ActiveCfg = Release|x86 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|x64.ActiveCfg = Release|x64 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|x64.Build.0 = Release|x64 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|x86.ActiveCfg = Release|x86 {41E2A272-150F-42F5-AD40-047AAD9088A0}.Release|x86.Build.0 = Release|x86 + {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|ARM.ActiveCfg = Debug|Win32 + {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|ARM64.ActiveCfg = Debug|Win32 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|x64.ActiveCfg = Debug|x64 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|x64.Build.0 = Debug|x64 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|x86.ActiveCfg = Debug|Win32 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Debug|x86.Build.0 = Debug|Win32 + {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|ARM.ActiveCfg = Release|Win32 + {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|ARM64.ActiveCfg = Release|Win32 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|x64.ActiveCfg = Release|x64 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|x64.Build.0 = Release|x64 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|x86.ActiveCfg = Release|Win32 {0212A7C5-8D3F-443C-9EBC-1F28091FDF88}.Release|x86.Build.0 = Release|Win32 + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|ARM.ActiveCfg = Debug|ARM + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|ARM.Build.0 = Debug|ARM + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|ARM64.ActiveCfg = Debug|Win32 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|x64.ActiveCfg = Debug|x64 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|x64.Build.0 = Debug|x64 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|x86.ActiveCfg = Debug|Win32 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Debug|x86.Build.0 = Debug|Win32 + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|ARM.ActiveCfg = Release|ARM + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|ARM.Build.0 = Release|ARM + {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|ARM64.ActiveCfg = Release|Win32 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|x64.ActiveCfg = Release|x64 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|x64.Build.0 = Release|x64 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|x86.ActiveCfg = Release|Win32 {13333A6F-6A4A-48CD-865C-0F65135EB018}.Release|x86.Build.0 = Release|Win32 + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|ARM.ActiveCfg = Debug|ARM + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|ARM.Build.0 = Debug|ARM + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|ARM64.ActiveCfg = Debug|Win32 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|x64.ActiveCfg = Debug|x64 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|x64.Build.0 = Debug|x64 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|x86.ActiveCfg = Debug|Win32 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Debug|x86.Build.0 = Debug|Win32 + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|ARM.ActiveCfg = Release|ARM + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|ARM.Build.0 = Release|ARM + {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|ARM64.ActiveCfg = Release|Win32 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|x64.ActiveCfg = Release|x64 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|x64.Build.0 = Release|x64 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|x86.ActiveCfg = Release|Win32 {0080F6D1-AEC3-4F89-ADE1-3D22A7EBF99E}.Release|x86.Build.0 = Release|Win32 + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|ARM.ActiveCfg = Debug|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|ARM.Build.0 = Debug|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|ARM64.Build.0 = Debug|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|x64.ActiveCfg = Debug|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|x64.Build.0 = Debug|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|x86.ActiveCfg = Debug|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Debug|x86.Build.0 = Debug|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|ARM.ActiveCfg = Release|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|ARM.Build.0 = Release|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|ARM64.ActiveCfg = Release|Any CPU + {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|ARM64.Build.0 = Release|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|x64.ActiveCfg = Release|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|x64.Build.0 = Release|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|x86.ActiveCfg = Release|Any CPU {FC05C557-C974-4CB3-9DA7-BB5476710E91}.Release|x86.Build.0 = Release|Any CPU + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|ARM.ActiveCfg = Debug|x86 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|ARM64.ActiveCfg = Debug|arm64 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|ARM64.Build.0 = Debug|arm64 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|ARM64.Deploy.0 = Debug|arm64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x64.ActiveCfg = Debug|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x64.Build.0 = Debug|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x64.Deploy.0 = Debug|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x86.ActiveCfg = Debug|x86 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x86.Build.0 = Debug|x86 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Debug|x86.Deploy.0 = Debug|x86 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|ARM.ActiveCfg = Release|x86 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|ARM64.ActiveCfg = Release|arm64 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|ARM64.Build.0 = Release|arm64 + {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|ARM64.Deploy.0 = Release|arm64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x64.ActiveCfg = Release|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x64.Build.0 = Release|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x64.Deploy.0 = Release|x64 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x86.ActiveCfg = Release|x86 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x86.Build.0 = Release|x86 {75B1621F-EC51-4D77-BD7E-BEE576B3ADC9}.Release|x86.Deploy.0 = Release|x86 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|ARM.ActiveCfg = Debug|Win32 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|ARM64.ActiveCfg = Debug|arm64 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|ARM64.Build.0 = Debug|arm64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|x64.ActiveCfg = Debug|x64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|x64.Build.0 = Debug|x64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|x86.ActiveCfg = Debug|Win32 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Debug|x86.Build.0 = Debug|Win32 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|ARM.ActiveCfg = Release|Win32 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|ARM64.ActiveCfg = Release|arm64 + {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|ARM64.Build.0 = Release|arm64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|x64.ActiveCfg = Release|x64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|x64.Build.0 = Release|x64 {493C7729-2F21-4198-AB09-BDF56BF501D3}.Release|x86.ActiveCfg = Release|Win32 diff --git a/src/cswinrt/Directory.Build.props b/src/cswinrt/Directory.Build.props new file mode 100644 index 000000000..a07333970 --- /dev/null +++ b/src/cswinrt/Directory.Build.props @@ -0,0 +1,11 @@ + + + + + + + %(AdditionalOptions) /D UAC_VERSION=99 + + + + diff --git a/src/cswinrt/Directory.Build.targets b/src/cswinrt/Directory.Build.targets index bdfcec900..1296467d1 100644 --- a/src/cswinrt/Directory.Build.targets +++ b/src/cswinrt/Directory.Build.targets @@ -1,5 +1,17 @@ - + + $(MidlRTCopyWinMDToOutputDirectoryDependsOn);CopyWinRTInteropWinMD + + + + + + + + diff --git a/src/cswinrt/WinRT.Interop.idl b/src/cswinrt/WinRT.Interop.idl new file mode 100644 index 000000000..3a016cff0 --- /dev/null +++ b/src/cswinrt/WinRT.Interop.idl @@ -0,0 +1,182 @@ +// Modern IDL 3.0: https://docs.microsoft.com/en-us/uwp/midl-3/intro + +// Note: the projection generated for this metadata should be internal, and only +// accessed indirectly with the user-friendly wrappers in ComInteropHelpers.cs. +namespace WinRT.Interop +{ + // C#/WinRT provides support for generating internal interface projections + [attributeusage(target_interface)] + [attributename("ProjectionInternal")] + attribute ProjectionInternalAttribute + { + } + + // C#/WinRT provides a custom mapping of WinRT.Interop.HWND to System.IntPtr + struct HWND + { + Int32 unused; + }; + + // accountssettingspaneinterop.idl +#if UAC_VERSION > 2 + [uuid(D3EE12AD-3865-4362-9746-B75A682DF0E6), ProjectionInternal] + interface IAccountsSettingsPaneInterop + { + Object GetForWindow( + HWND appWindow, + GUID riid); + Object ShowManageAccountsForWindowAsync( + HWND appWindow, + GUID riid); + Object ShowAddAccountForWindowAsync( + HWND appWindow, + GUID riid); + } +#endif + + // dragdropinterop.idl +#if UAC_VERSION > 0 + [uuid(5AD8CBA7-4C01-4DAC-9074-827894292D63), ProjectionInternal] + interface IDragDropManagerInterop + { + Object GetForWindow( + HWND hwnd, + GUID riid); + } +#endif + + // inputpaneinterop.idl +#if UAC_VERSION > 2 + [uuid(75CF2C57-9195-4931-8332-F0B409E916AF), ProjectionInternal] + interface IInputPaneInterop + { + Object GetForWindow( + HWND appWindow, + GUID riid); + } +#endif + + // PlayToManagerInterop.idl +#if UAC_VERSION > 0 + [uuid(24394699-1F2C-4EB3-8CD7-0EC1DA42A540), ProjectionInternal] + interface IPlayToManagerInterop + { + Object GetForWindow( + HWND appWindow, + GUID riid); + + void ShowPlayToUIForWindow( + HWND appWindow); + } +#endif + + // PrintManagerInterop.idl +#if UAC_VERSION > 0 + [uuid(c5435a42-8d43-4e7b-a68a-ef311e392087), ProjectionInternal] + interface IPrintManagerInterop + { + Object GetForWindow( + HWND appWindow, + GUID riid); + + Object ShowPrintUIForWindowAsync( + HWND appWindow, + GUID riid); + } +#endif + + // RadialControllerInterop.idl +#if UAC_VERSION > 2 + [uuid(1B0535C9-57AD-45C1-9D79-AD5C34360513), ProjectionInternal] + interface IRadialControllerInterop + { + Object CreateForWindow( + HWND hwnd, + GUID riid); + } +#endif + +#if UAC_VERSION > 2 + [uuid(787cdaac-3186-476d-87e4-b9374a7b9970), ProjectionInternal] + interface IRadialControllerConfigurationInterop + { + Object GetForWindow( + HWND hwnd, + GUID riid); + } +#endif + +#if UAC_VERSION > 3 + [uuid(3D577EFF-4CEE-11E6-B535-001BDC06AB3B), ProjectionInternal] + interface IRadialControllerIndependentInputSourceInterop + { + Object CreateForWindow( + HWND hwnd, + GUID riid); + } +#endif + + // SpatialInteractionManagerInterop.idl + // This interop interface is duplicated by IHolographicSpaceInterop, which has the same IID +#if UAC_VERSION > 3 + [uuid(5C4EE536-6A98-4B86-A170-587013D6FD4B), ProjectionInternal] + interface ISpatialInteractionManagerInterop + { + Object GetForWindow( + HWND window, + GUID riid); + } +#endif + + // SystemMediaTransportControlsInterop.idl +#if UAC_VERSION > 0 + [uuid(ddb0472d-c911-4a1f-86d9-dc3d71a95f5a), ProjectionInternal] + interface ISystemMediaTransportControlsInterop + { + Object GetForWindow( + HWND appWindow, + GUID riid); + } +#endif + + // UIViewSettingsInterop.idl +#if UAC_VERSION > 0 + [uuid(3694dbf9-8f68-44be-8ff5-195c98ede8a6), ProjectionInternal] + interface IUIViewSettingsInterop + { + Object GetForWindow( + HWND hwnd, + GUID riid); + } +#endif + + // UserConsentVerifierInterop.idl +#if UAC_VERSION > 4 + [uuid(39E050C3-4E74-441A-8DC0-B81104DF949C), ProjectionInternal] + interface IUserConsentVerifierInterop + { + Object RequestVerificationForWindowAsync( + HWND appWindow, + String message, + GUID riid); + } +#endif + + // WebAuthenticationCoreManagerInterop.idl +#if UAC_VERSION > 0 + [uuid(F4B8E804-811E-4436-B69C-44CB67B72084), ProjectionInternal] + interface IWebAuthenticationCoreManagerInterop + { + Object RequestTokenForWindowAsync( + HWND appWindow, + Windows.Security.Authentication.Web.Core.WebTokenRequest request, + GUID riid); // __uuidof(IAsyncOperation) + + Object RequestTokenWithWebAccountForWindowAsync( + HWND appWindow, + Windows.Security.Authentication.Web.Core.WebTokenRequest request, + Windows.Security.Credentials.WebAccount webAccount, + GUID riid); // __uuidof(IAsyncOperation) + } +#endif +} \ No newline at end of file diff --git a/src/cswinrt/code_writers.h b/src/cswinrt/code_writers.h index c0b190a86..193e7c0d0 100644 --- a/src/cswinrt/code_writers.h +++ b/src/cswinrt/code_writers.h @@ -1468,8 +1468,9 @@ remove => %.% -= value; { auto [attribute_namespace, attribute_name] = attribute.TypeNamespaceAndName(); attribute_name = attribute_name.substr(0, attribute_name.length() - "Attribute"sv.length()); - // GCPressure, Guid, Flags are handled separately - if (attribute_name == "GCPressure" || attribute_name == "Guid" || attribute_name == "Flags") continue; + // GCPressure, Guid, Flags, ProjectionInternal are handled separately + if (attribute_name == "GCPressure" || attribute_name == "Guid" || + attribute_name == "Flags" || attribute_name == "ProjectionInternal") continue; auto attribute_full = (attribute_name == "AttributeUsage") ? "AttributeUsage" : w.write_temp("%.%", attribute_namespace, attribute_name); auto signature = attribute.Value(); @@ -2514,10 +2515,11 @@ db_path.stem().string()); void write_static_class(writer& w, TypeDef const& type) { - w.write(R"(%public static class % + w.write(R"(%%public static class % { %})", bind(type), + bind(type, true), bind(type, typedef_name_type::Projected, false), bind(type) ); @@ -4909,7 +4911,7 @@ IInspectableVftbl = global::WinRT.IInspectable.Vftbl.AbiToProjectionVftable, bind(type), bind(type), bind(type, false), - is_exclusive_to(type) ? "internal" : "public", + is_exclusive_to(type) || is_projection_internal(type) ? "internal" : "public", type_name, bind(type, object_type{}, false, false), bind(type) @@ -6452,7 +6454,7 @@ bind(type, typedef_name_type::CCW, true) { std::vector genericArgs; auto arg_count = std::get(eventTypeSemantics).generic_args.size(); - for (int i = 0; i < arg_count; i++) + for (int i = 0; i < arg_count; ++i ) { auto semantics = w.get_generic_arg_scope(i).first; if (std::holds_alternative(semantics)) diff --git a/src/cswinrt/cswinrt.vcxproj b/src/cswinrt/cswinrt.vcxproj index 8303e61f6..674c12582 100644 --- a/src/cswinrt/cswinrt.vcxproj +++ b/src/cswinrt/cswinrt.vcxproj @@ -1,5 +1,6 @@  + 15.0 @@ -69,6 +70,7 @@ + @@ -108,15 +110,23 @@ + + + + - + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. + + \ No newline at end of file diff --git a/src/cswinrt/cswinrt.vcxproj.filters b/src/cswinrt/cswinrt.vcxproj.filters index 54b0f08fc..57e31721d 100644 --- a/src/cswinrt/cswinrt.vcxproj.filters +++ b/src/cswinrt/cswinrt.vcxproj.filters @@ -170,5 +170,12 @@ + + + strings + + + + \ No newline at end of file diff --git a/src/cswinrt/helpers.h b/src/cswinrt/helpers.h index 04c2a262b..e95e2cdd6 100644 --- a/src/cswinrt/helpers.h +++ b/src/cswinrt/helpers.h @@ -38,6 +38,11 @@ namespace cswinrt return get_category(type) == category::interface_type && has_attribute(type, "Windows.Foundation.Metadata"sv, "ExclusiveToAttribute"sv); } + bool is_projection_internal(TypeDef const& type) + { + return has_attribute(type, "WinRT.Interop"sv, "ProjectionInternalAttribute"sv); + } + bool is_flags_enum(TypeDef const& type) { return get_category(type) == category::enum_type && has_attribute(type, "System"sv, "FlagsAttribute"sv); @@ -557,6 +562,12 @@ namespace cswinrt { "Matrix3DHelper" }, } }, + { "WinRT.Interop", + { + { "HWND", "System", "IntPtr" }, + { "ProjectionInternalAttribute" }, + } + }, { "Windows.Foundation", { { "DateTime", "System", "DateTimeOffset", true }, diff --git a/src/cswinrt/main.cpp b/src/cswinrt/main.cpp index 1a4254304..e700b4a2a 100644 --- a/src/cswinrt/main.cpp +++ b/src/cswinrt/main.cpp @@ -342,6 +342,10 @@ Where is one or more of: { for (auto&& string : strings::base) { + if (std::string(string.name) == "ComInteropHelpers" && !settings.filter.includes("Windows")) + { + continue; + } writer ws; ws.write("// This file was generated by cswinrt.exe version %", VERSION_STRING); ws.write(string.value); diff --git a/src/cswinrt/packages.config b/src/cswinrt/packages.config index fd4cca025..293ccb4f7 100644 --- a/src/cswinrt/packages.config +++ b/src/cswinrt/packages.config @@ -1,4 +1,5 @@ - - - - + + + + + \ No newline at end of file diff --git a/src/cswinrt/strings/ComInteropHelpers.cs b/src/cswinrt/strings/ComInteropHelpers.cs new file mode 100644 index 000000000..cf417b398 --- /dev/null +++ b/src/cswinrt/strings/ComInteropHelpers.cs @@ -0,0 +1,343 @@ +#if UAC_VERSION_13 +#define UAC_VERSION_12 +#endif +#if UAC_VERSION_12 +#define UAC_VERSION_11 +#endif +#if UAC_VERSION_11 +#define UAC_VERSION_10 +#endif +#if UAC_VERSION_10 +#define UAC_VERSION_9 +#endif +#if UAC_VERSION_9 +#define UAC_VERSION_8 +#endif +#if UAC_VERSION_8 +#define UAC_VERSION_7 +#endif +#if UAC_VERSION_7 +#define UAC_VERSION_6 +#endif +#if UAC_VERSION_6 +#define UAC_VERSION_5 +#endif +#if UAC_VERSION_5 +#define UAC_VERSION_4 +#endif +#if UAC_VERSION_4 +#define UAC_VERSION_3 +#endif +#if UAC_VERSION_3 +#define UAC_VERSION_2 +#endif +#if UAC_VERSION_2 +#define UAC_VERSION_1 +#endif +#if !UAC_VERSION_1 +#error Unsupported Universal API Contract version +#endif + +using System; +using System.Runtime.InteropServices; +using Windows.Foundation; +using Windows.Security.Credentials; +using WinRT; +using WinRT.Interop; + +namespace WinRT.Interop +{ + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("EECDBF0E-BAE9-4CB6-A68E-9598E1CB57BB")] + internal interface IWindowNative + { + IntPtr WindowHandle { get; } + } + + public static class WindowNative + { + public static IntPtr GetWindowHandle(object target) => target.As().WindowHandle; + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")] + internal interface IInitializeWithWindow + { + void Initialize(IntPtr hwnd); + } + + public static class InitializeWithWindow + { + public static void Initialize(object target, IntPtr hwnd) => target.As().Initialize(hwnd); + } +} + +namespace Windows.ApplicationModel.DataTransfer.DragDrop.Core +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class DragDropManagerInterop + { + private static IDragDropManagerInterop dragDropManagerInterop = CoreDragDropManager.As(); + + public static CoreDragDropManager GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(ICoreDragDropManager)); + return (CoreDragDropManager)dragDropManagerInterop.GetForWindow(appWindow, iid); + } + } +#endif +} + +namespace Windows.Graphics.Printing +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class PrintManagerInterop + { + private static IPrintManagerInterop printManagerInterop = PrintManager.As(); + + public static PrintManager GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IPrintManager)); + return (PrintManager)printManagerInterop.GetForWindow(appWindow, iid); + } + + public static IAsyncOperation ShowPrintUIForWindowAsync(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IAsyncOperation)); + return (IAsyncOperation)printManagerInterop.ShowPrintUIForWindowAsync(appWindow, iid); + } + } +#endif +} + +namespace Windows.Media +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class SystemMediaTransportControlsInterop + { + private static ISystemMediaTransportControlsInterop systemMediaTransportControlsInterop = SystemMediaTransportControls.As(); + + public static SystemMediaTransportControls GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(ISystemMediaTransportControls)); + return (SystemMediaTransportControls)systemMediaTransportControlsInterop.GetForWindow(appWindow, iid); + } + } +#endif +} + +namespace Windows.Media.PlayTo +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class PlayToManagerInterop + { + private static IPlayToManagerInterop playToManagerInterop = PlayToManager.As(); + + public static PlayToManager GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IPlayToManager)); + return (PlayToManager)playToManagerInterop.GetForWindow(appWindow, iid); + } + + public static void ShowPlayToUIForWindow(IntPtr appWindow) + { + playToManagerInterop.ShowPlayToUIForWindow(appWindow); + } + } +#endif +} + +namespace Windows.Security.Credentials.UI +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class UserConsentVerifierInterop + { + private static IUserConsentVerifierInterop userConsentVerifierInterop = UserConsentVerifier.As(); + + public static IAsyncOperation RequestVerificationForWindowAsync(IntPtr appWindow, string message) + { + var iid = GuidGenerator.CreateIID(typeof(IAsyncOperation)); + return (IAsyncOperation)userConsentVerifierInterop.RequestVerificationForWindowAsync(appWindow, message, iid); + } + } +#endif +} + +namespace Windows.Security.Authentication.Web.Core +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class WebAuthenticationCoreManagerInterop + { + private static IWebAuthenticationCoreManagerInterop webAuthenticationCoreManagerInterop = WebAuthenticationCoreManager.As(); + + public static IAsyncInfo RequestTokenForWindowAsync(IntPtr appWindow, WebTokenRequest request) + { + var iid = GuidGenerator.CreateIID(typeof(IAsyncOperation)); + return (IAsyncInfo)webAuthenticationCoreManagerInterop.RequestTokenForWindowAsync(appWindow, request, iid); + } + + public static IAsyncInfo RequestTokenWithWebAccountForWindowAsync(IntPtr appWindow, WebTokenRequest request, WebAccount webAccount) + { + var iid = GuidGenerator.CreateIID(typeof(IAsyncOperation)); + return (IAsyncInfo)webAuthenticationCoreManagerInterop.RequestTokenWithWebAccountForWindowAsync(appWindow, request, webAccount, iid); + } + } +#endif +} + +namespace Windows.UI.ApplicationSettings +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class AccountsSettingsPaneInterop + { + private static IAccountsSettingsPaneInterop accountsSettingsPaneInterop = AccountsSettingsPane.As(); + + public static AccountsSettingsPane GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IAccountsSettingsPane)); + return (AccountsSettingsPane)accountsSettingsPaneInterop.GetForWindow(appWindow, iid); + } + + public static IAsyncAction ShowManageAccountsForWindowAsync(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IAsyncAction)); + return (IAsyncAction)accountsSettingsPaneInterop.ShowManageAccountsForWindowAsync(appWindow, iid); + } + + public static IAsyncAction ShowAddAccountForWindowAsync(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IAsyncAction)); + return (IAsyncAction)accountsSettingsPaneInterop.ShowAddAccountForWindowAsync(appWindow, iid); + } + } +#endif +} + +namespace Windows.UI.Input +{ +#if UAC_VERSION_3 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.14393.0")] +#endif + public static class RadialControllerConfigurationInterop + { + private static IRadialControllerConfigurationInterop radialControllerConfigurationInterop + = RadialControllerConfiguration.As(); + + public static RadialControllerConfiguration GetForWindow(IntPtr hwnd) + { + Guid iid = GuidGenerator.CreateIID(typeof(IRadialControllerConfiguration)); + return (RadialControllerConfiguration)radialControllerConfigurationInterop.GetForWindow(hwnd, iid); + } + } + +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.14393.0")] +#endif + public static class RadialControllerInterop + { + private static IRadialControllerInterop radialControllerInterop = RadialController.As(); + + public static RadialController CreateForWindow(IntPtr hwnd) + { + Guid iid = GuidGenerator.CreateIID(typeof(IRadialController)); + return (RadialController)radialControllerInterop.CreateForWindow(hwnd, iid); + } + } +#endif +} + +namespace Windows.UI.Input.Core +{ +#if UAC_VERSION_4 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.15063.0")] +#endif + public static class RadialControllerIndependentInputSourceInterop + { + private static IRadialControllerIndependentInputSourceInterop radialControllerIndependentInputSourceInterop + = RadialControllerIndependentInputSource.As(); + + public static RadialControllerIndependentInputSource CreateForWindow(IntPtr hwnd) + { + Guid iid = GuidGenerator.CreateIID(typeof(IRadialControllerIndependentInputSource)); + return (RadialControllerIndependentInputSource)radialControllerIndependentInputSourceInterop.CreateForWindow(hwnd, iid); + } + } +#endif +} + +namespace Windows.UI.Input.Spatial +{ +#if UAC_VERSION_2 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10586.0")] +#endif + public static class SpatialInteractionManagerInterop + { + private static ISpatialInteractionManagerInterop spatialInteractionManagerInterop = SpatialInteractionManager.As(); + + public static SpatialInteractionManager GetForWindow(IntPtr window) + { + Guid iid = GuidGenerator.CreateIID(typeof(ISpatialInteractionManager)); + return (SpatialInteractionManager)spatialInteractionManagerInterop.GetForWindow(window, iid); + } + } +#endif +} + +namespace Windows.UI.ViewManagement +{ +#if UAC_VERSION_1 +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class InputPaneInterop + { + private static IInputPaneInterop inputPaneInterop = InputPane.As(); + + public static InputPane GetForWindow(IntPtr appWindow) + { + Guid iid = GuidGenerator.CreateIID(typeof(IInputPane)); + return (InputPane)inputPaneInterop.GetForWindow(appWindow, iid); + } + } + +#if !NETSTANDARD2_0 + [global::System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.10240.0")] +#endif + public static class UIViewSettingsInterop + { + private static IUIViewSettingsInterop uIViewSettingsInterop = UIViewSettings.As(); + + public static UIViewSettings GetForWindow(IntPtr hwnd) + { + var iid = GuidGenerator.CreateIID(typeof(IUIViewSettings)); + return (UIViewSettings)uIViewSettingsInterop.GetForWindow(hwnd, iid); + } + } +#endif +}