Browse Source
* Create wrapper for IApiInformationStatics * Use ApiInformation APIs to get if WinRT types are supported * Add some docs #Conflicts: # src/Windows/Avalonia.Win32/Input/WindowsInputPane.cs # src/Windows/Avalonia.Win32/WinRT/winrt.idl # src/Windows/Avalonia.Win32/WindowImpl.csrelease/11.0.7
3 changed files with 180 additions and 1 deletions
@ -0,0 +1,160 @@ |
|||||
|
using System; |
||||
|
using Avalonia.Logging; |
||||
|
using MicroCom.Runtime; |
||||
|
|
||||
|
namespace Avalonia.Win32.WinRT; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Any WinRT API might not be available even if Windows version is supposed to support them (Win PE, Xbox...).
|
||||
|
/// Using ApiInformation is a typical solution in UWP/WinUI apps, so we should do as well.
|
||||
|
/// </summary>
|
||||
|
internal static unsafe class WinRTApiInformation |
||||
|
{ |
||||
|
private static readonly Lazy<IApiInformationStatics?> s_statics = new(() => |
||||
|
{ |
||||
|
if (Win32Platform.WindowsVersion.Major < 10) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
using var apiStatics = NativeWinRTMethods.CreateActivationFactory<IApiInformationStatics>( |
||||
|
"Windows.Foundation.Metadata.ApiInformation"); |
||||
|
return apiStatics.CloneReference(); |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
Logger.TryGet(LogEventLevel.Warning, LogArea.Win32Platform)? |
||||
|
.Log(null, "Unable to create ApiInformation instance: {0}", ex); |
||||
|
return null; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
public static bool IsTypePresent(string typeName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsTypePresent(typeNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsMethodPresent(string typeName, string methodName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var methodNamePtr = new HStringInterop(methodName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsMethodPresent(typeNamePtr.Handle, methodNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsMethodPresentWithArity(string typeName, string methodName, uint inputParameterCount) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var methodNamePtr = new HStringInterop(methodName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsMethodPresentWithArity(typeNamePtr.Handle, methodNamePtr.Handle, inputParameterCount, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsEventPresent(string typeName, string eventName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var eventNamePtr = new HStringInterop(eventName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsEventPresent(typeNamePtr.Handle, eventNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsPropertyPresent(string typeName, string propertyName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var propertyNamePtr = new HStringInterop(propertyName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsPropertyPresent(typeNamePtr.Handle, propertyNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsReadOnlyPropertyPresent(string typeName, string propertyName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var propertyNamePtr = new HStringInterop(propertyName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsReadOnlyPropertyPresent(typeNamePtr.Handle, propertyNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsWriteablePropertyPresent(string typeName, string propertyName) |
||||
|
{ |
||||
|
using var typeNamePtr = new HStringInterop(typeName); |
||||
|
using var propertyNamePtr = new HStringInterop(propertyName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsWriteablePropertyPresent(typeNamePtr.Handle, propertyNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsEnumNamedValuePresent(string enumTypeName, string valueName) |
||||
|
{ |
||||
|
using var enumTypeNamePtr = new HStringInterop(enumTypeName); |
||||
|
using var valueNamePtr = new HStringInterop(valueName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsEnumNamedValuePresent(enumTypeNamePtr.Handle, valueNamePtr.Handle, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsApiContractPresentByMajor(string contractName, ushort majorVersion) |
||||
|
{ |
||||
|
using var contractNamePtr = new HStringInterop(contractName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsApiContractPresentByMajor(contractNamePtr.Handle, majorVersion, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static bool IsApiContractPresentByMajorAndMinor(string contractName, ushort majorVersion, ushort minorVersion) |
||||
|
{ |
||||
|
using var contractNamePtr = new HStringInterop(contractName); |
||||
|
var result = 0; |
||||
|
if (s_statics.Value?.IsApiContractPresentByMajorAndMinor(contractNamePtr.Handle, majorVersion, minorVersion, &result) == 0) |
||||
|
{ |
||||
|
return result == 1; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue