2013-01-08 88 views
3

我有一個解決方案庫(DLL),用於2個相同的項目(一個用於WP7,另一個用於WP8)。在其中一個庫中,我有確定應用程序版本的代碼。獲取「主」程序集版本號

private static Version mVersion; 
    public static Version Version { 
     get { 
      if (mVersion == default(Version)) { 
       var lcAssembly = Assembly.GetExecutingAssembly(); 
       var parts = lcAssembly.FullName.Split(','); 
       var lcVersionStr = parts[1].Split('=')[1]; 
       mVersion = new Version(lcVersionStr); 
      } 
      return mVersion; 
     } 
    } 

問題是此代碼由於Assembly.GetExecutingAssembly()代碼返回庫本身的版本號。如何獲得MAIN彙編版本,而不是DLL的?

回答

3

這是WP7和WP8之間代碼共享的一個很好的問題。

最簡單的方法你要做的就是在運行時讀取AppManfiest.xml文件,獲取EntryType並使用它獲取入口點Assembly實例。下面是一個示例AppManfiest.xml怎麼看起來像曾經的MSBuild做它的魔力就可以了:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="myAssembly" EntryPointType="myNamespace.App" RuntimeVersion="4.7.50308.0"> 
    <Deployment.Parts> 
    <AssemblyPart x:Name="myAssembly" Source="myAssembly.dll" /> 
    </Deployment.Parts> 
</Deployment> 

而且這裏是你將如何讀取文件,獲得的屬性,然後獲取入口點類型,最後的入口點組件:

private void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    var appManfiest = XElement.Load("AppManifest.xaml"); 
    var entryAssemblyName = appManfiest.Attribute("EntryPointAssembly").Value; 
    var entryTypeName = appManfiest.Attribute("EntryPointType").Value; 
    Type entryType = Type.GetType(entryTypeName + "," + entryAssemblyName); 
    Assembly entryAssembly = entryType.Assembly; 
} 

這是一個簡單的解決方案,它的工作原理。但是,這不是最乾淨的架構解決方案。我實現這個解決方案的方式是在共享庫中聲明一個接口,WP7和WP8都實現該接口,並使用IoC容器註冊它們的實現。

例如,假設您需要在平臺版本特定的共享庫中「DoSomething」。首先你會創建一個IDoSomething接口。我們還假設你有一個IoC支持。

public interface IDoSomething 
{ 

} 

public static class IoC 
{ 
    public static void Register<T>(T t) 
    { 
     // use some IoC container 
    } 

    public static T Get<T>() 
    { 
     // use some IoC container 
    } 
} 

在WP7應用程序中,您將實現WP7的共享接口並在WP7啓動後註冊它。

public App() 
{ 
    MainPage.IoC.Register(new MainPage.DoSomethingWP7()); 
} 

private class DoSomethingWP7 : IDoSomething 
{ 
} 

您也將在WP8應用程序中爲WP8做同樣的事情。然後在共享庫中,您可以請求相關接口,而不管其平臺版本的具體實現如何:

IDoSomething sharedInterface = IoC.Get<IDoSomething>(); 
0

我有一個更簡單的答案。我認爲你接近你正在做的事情。我只用一個修改就可以使用你的代碼,所以我可以在Telerik控件中使用它。這就是我所做的。我將你的代碼放在我的項目的App類中(App.Xaml的代碼隱藏)。我只有一個變化,我想將你的問題的護理:

private static Version mVersion; 
public static Version Version { 
    get { 
     if (mVersion == default(Version)) { 
      var lcAssembly = typeof(App); 
      var parts = lcAssembly.FullName.Split(','); 
      var lcVersionStr = parts[1].Split('=')[1]; 
      mVersion = new Version(lcVersionStr); 
     } 
     return mVersion; 
    } 
} 

現在,我可以通過調用「App.Version」得到的版本號。

0

這爲我工作:

var appAssembly = Application.Current.GetType().Assembly; 
var appAssemblyVersion = appAssembly.GetName().Version; 

我WP7.1和WP8.0測試。

相關問題