如何在可移植类库中获取应用程序名称和版本?

时间:2016-02-06 06:10:14

标签: uwp portability

我想知道如何在便携式类库中获取产品名称或产品版本。到目前为止,我已尝试过以下所有这些:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

此处的错误是找不到GetExecutingAssembly()。

AppDomain.CurrentDomain.DomainManager.EntryAssembly.GetName().Version

此处的错误是找不到AppDomain。

public static string Version
{
    get
    {
        var assembly = typeof(MyType).GetTypeInfo().Assembly;
        // In some PCL profiles the above line is: var assembly = typeof(MyType).Assembly;
        var assemblyName = new AssemblyName(assembly.FullName);
        return assemblyName.Version.Major + "." + assemblyName.Version.Minor;
    }
}

这个问题是这给出了PCL的版本,而不是应用程序的版本。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

你写的一切都是真的。据我所知,所有支持的平台都没有通用的方法来获取对应用程序的入口程序集的引用,并且在可移植类库中没有可用的通用API。

但是,这并不一定会阻止您在便携式类库中获取此信息。您需要抽象出这个功能,并利用依赖注入为每个平台提供正确的实现。

您的便携式类库将实现一个通用接口:

public interface IProductInfoProvider
{
    string GetVersion();
}

对于完整的.NET框架,您可以像这样实现它:

public class ProductInfoProvider : IProductInfoProvider
{
    public Version GetVersion()
    {
        return Assembly.GetExecutingAssembly().GetName().Version;
    }
}

需要版本信息的类将接受IProductInfoProvider的实例作为构造函数参数,允许在必要时调用它:

public class MyClass
{
    private readonly IProductInfoProvider _productInfoProvider;

    public MyClass(IProductInfoProvider productInfoProvider)
    {
        _productInfoProvider = productInfoProvider;
    }
}

在实例化类时,您将传递接口的正确实现:

var myInstance = new MyClass(new ProductInfoProvider());

由于您可能希望在可移植类库中实例化该类,因此您将使用依赖注入框架(例如Ninject)在特定于平台的应用程序初始化中定义正确的实现:

public class ApplicationModule : NinjectModule
{
    public override void Load() 
    {
        this.Bind<IProductInfoProvider>().To<ProductInfoProvider>();
    }
}

这将允许Ninject创建MyClass的新实例,并注入IProductInfoProvider的正确实现。