2013-05-13 24 views
15

Ho la seguente riga di codice in .NET 4.5 che sto cercando di creare come libreria di classi portatili. Il suo scopo è quello di ottenere la versione di montaggio:Ottenere la versione di assemblaggio in PCL

this.GetType().Assembly.GetName().Version.Major; 

Il problema è che Assembly.GetName() non è disponibile in PCL. C'è un modo per ottenere la versione di assemblaggio in PCL?

So che è possibile analizzare Assembly.FullName, ma voglio una soluzione migliore.

risposta

21
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; 
     } 
    } 
+5

Si prega di non utilizzare 'Assembly.GetExecutingAssembly()'. In primo luogo, è piuttosto costoso e in secondo luogo ha tutti i tipi di problemi w.r.t. quando il lato della chiamata è in linea. Pertanto, non lo esponiamo in Windows Store. Nei metodi statici puoi usare 'typeof (MyType) .GetTypeInfo(). Assembly'. Nei metodi di istanza dovresti usare 'GetType(). GetTypeInfo(). Assembly'. –

+0

Grazie, l'ho cambiato. Non è disponibile GetTypeInfo() nel mio PCL (Profile95), ma posso chiamare Assembly direttamente sul tipo. – pauldendulk

+0

Hai ragione. GetTypeInfo() è disponibile solo per pubblicare piattaforme .NET 4.5 (.NET 4.5, Windows Store e Windows Phone 8). –

2

Si stanno prendendo di mira una piattaforma basata su Silverlight (Silverlight 4 o superiore, Windows Phone prima della versione 8). Queste piattaforme non supportano il metodo GetName(). Per queste piattaforme, è possibile definire un metodo di estensione in questo modo:

public static class AssemblyExtensions 
{ 
    public static AssemblyName GetName(this Assembly assembly) 
    { 
     return new AssemblyName(assembly.FullName); 
    } 
} 
6

io uso il seguente:

[assembly: AssemblyTitle(AssemblyInfo.AssemblyTitle)] 
[assembly: AssemblyProduct(AssemblyInfo.AssemblyProduct)] 

[assembly: AssemblyVersion(AssemblyInfo.AssemblyVersion)] 
[assembly: AssemblyFileVersion(AssemblyInfo.AssemblyFileVersion)] 
[assembly: AssemblyInformationalVersion(AssemblyInfo.AssemblyInformationalVersion)] 

internal class AssemblyInfo 
{ 
    public const string AssemblyTitle = "..."; 
    public const string AssemblyProduct = "..."; 

    public const string AssemblyVersion = "1.0.0.0"; 
    public const string AssemblyFileVersion = "1.0.0.0"; 
    public const string AssemblyInformationalVersion = "1.0.0.0-dev"; 
} 

Questo mi permette di fare riferimento a una delle costanti in seno all'Assemblea senza l'utilizzo di riflessione, per esempio AssemblyInfo.AssemblyProduct.

+0

Questo è un ottimo suggerimento! Normalmente trasferisco le informazioni sulla mia versione semantica su un file condiviso, questo è un cambiamento facile. – bryanbcook

Problemi correlati