2013-01-08 66 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测试。

相关问题