这是关于 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>();