這是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>();