2016-02-06 7 views
1

Мне было интересно, как получить название продукта или версию продукта в портативной библиотеке классов. До сих пор я пытался все это ниже:Как получить имя и версию приложения в портативной библиотеке классов?

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, а не версию приложения.

Спасибо всем.

+0

У вас есть доступ к этой переносимой библиотеке классов? –

+0

Я думаю, что использование инъекции зависимостей - это способ сделать это. –

+0

@GeraldGonzales yes У меня есть доступ к этому PCL Я создаю: https://github.com/McoreD/TreeGUI/blob/master/treegui4/HelpersLib/AppInfo.cs – McoreD

ответ

1

Все, что вы написали, верно. Насколько я знаю, на всех поддерживаемых платформах нет общего способа получить ссылку на сборку приложения, и для портативных библиотек классов нет общего 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 впрыскивается.