我有一个带有库(DLL)的解决方案,这些库在两个相同的项目中使用(一个用于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?
答案 0 :(得分:3)
这是关于WP7和WP8之间代码共享的一个很好的问题。
最简单的方法,您可以在运行时读取AppManfiest.xml文件,获取EntryType并使用它来获取入口点的Assembly实例。以下是MSBuild在其上发挥作用后AppManfiest.xml示例的样子:
<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>();
答案 1 :(得分: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”来获取版本号。
答案 2 :(得分:0)
这对我有用:
var appAssembly = Application.Current.GetType().Assembly;
var appAssemblyVersion = appAssembly.GetName().Version;
我测试了WP7.1和WP8.0。