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()。如何获得主程序集版本而不是 DLL?

4

3 回答 3

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>();
于 2013-01-08T23:31:12.597 回答
0

这对我有用:

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

我用 WP7.1 和 WP8.0 进行了测试。

于 2015-01-20T13:09:58.757 回答
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”来获取版本号。

于 2013-07-12T15:41:31.813 回答