在PCL中运行时检测通用应用程序

时间:2016-03-17 10:30:18

标签: .net c#-4.0 win-universal-app portable-class-library windows-10-universal

有没有办法从便携式类库中检测到主应用程序是通用应用程序(W10)?

由于

3 个答案:

答案 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)

你有几种方法: 第一:

  1. 将PCL添加到主项目(参考)
  2. 在PCL中创建enum以确定操作系统类型(例如OperationSystemType
  3. 在主要观点(开始) - 对于UWP,App.cs将正确值传递给PCL
  4. 秒(更灵活):

    1. 任何PCL中的克里特界面IApplicationProvider
    2. 为每个平台创建实施(在主项目中)。您可以在界面中添加OSType属性(例如)
    3. 在主项目(App.cs
    4. 中将IoC容器的接口绑定到实现
    5. 通过IoC实例获取接口并获得正确的值

答案 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;

它不漂亮,但确实有效,该技术也可用于检测其他平台。