有没有办法从便携式类库中检测到主应用程序是通用应用程序(W10)?
由于
答案 0 :(得分:1)
开箱即用我不认为您要求的功能在PCL中可用,但这里有一个涉及您可能想要尝试的反射的建议。
它适用于您正在使用的PCL配置文件(328),涉及.NET 4和Silverlight 5.如果您想要切换到PCL配置文件111和259,则需要稍微调整GetPlatformName
方法。 ,因为这些配置文件必须依赖TypeInfo
而不是Type
。
以下是提出的方法和附带的接口,可以在Portable Class Library中实现:
public static class RuntimeEnvironment
{
public static string GetPlatformName()
{
var callingAssembly = (Assembly)typeof(Assembly).GetMethod("GetCallingAssembly").Invoke(null, new object[0]);
var type = callingAssembly.GetTypes().Single(t => typeof(IPlatform).IsAssignableFrom(t));
var instance = (IPlatform)Activator.CreateInstance(type);
return instance.PlatformName;
}
}
public interface IPlatform
{
string PlatformName { get; }
}
除上述代码外,您还需要在每个特定于平台的应用程序中实现IPlatform
接口,例如:
public class UniversalPlatform : IPlatform
{
public string PlatformName => "UWP";
}
简而言之,GetPlatformName
方法实例化在调用(应用程序)程序集中实现IPlatform
接口的单个类,并返回PlatformName
属性。
Assembly.GetCallingAssembly
方法未在任何PCL配置文件中公开,但通常会实现,因此可以通过反射访问。
GetPlatformName
方法是完全可移植的,因此可以在可移植类库本身内使用,允许您在PCL代码中进行平台条件决策。该提案确实需要在每个特定于平台的应用程序中进行最少的代码工作,因为您确实需要实现IPlatform
,但这可能是可接受的代价?
答案 1 :(得分:0)
你有几种方法: 第一:
enum
以确定操作系统类型(例如OperationSystemType
)App.cs
将正确值传递给PCL 秒(更灵活):
IApplicationProvider
OSType
属性(例如)App.cs
)答案 2 :(得分:0)
从PCL中检测平台的一种方法是尝试在运行时加载仅适用于该平台的类型。
例如,对于UWP,您可以尝试加载类型Windows.System.Profile.AnalyticsInfo
,该类型仅在Windows 10 UWP应用程序中可用:
var win10Type = Type.GetType("Windows.System.Profile.AnalyticsInfo, Windows, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime");
var isWin10UWP = win10Type != null;
它不漂亮,但确实有效,该技术也可用于检测其他平台。