建立一個dotNet與Silverlight共享程式碼的組件的方式
由於Silverlight與dotNet的class library專案型態並不相同,因為Silverlight算是一個精簡版的dotnet library子集合,所以並非所有dotnet功能皆有,故兩者組件不能直接互通.所以當Silverlight引用dotnet class library的dll時會出現錯誤訊息.
但很多時候兩者的程式碼差異並不大所以簡的方式就是建立兩個class library專案,一為dotnet另一個為silverlight.然後將程式碼複製到兩個專案上,不過這樣做會導致事後維護上的問題,並非是一個好方法.幸運的是有鑑於此VS 2008之後增加了一個新功能來解決類似的問題-Add as link.
底下為操作方式
新增兩個專案-dotnet class library與Silverlight class library
然後在dotnet class library新增一個 class file撰寫一些功能最後整體專案如下
下一步就是在silverlight.SL專案上點滑鼠右鍵選擇 Add –> Existing Item…
然後選擇dotnet class library專案目錄中的.cs檔案後下方選擇Add as link來加入檔案
最後silverlight專案就會出現dotnet專案的檔案但是是以連結方式,所以不論修改得是哪個cs檔案最終都是同一個.
上面步驟解決了專案檔案共用問題,但還有個問題未解決,因上面說過Silverlight功能上與dotnet並不完全相同或是短少,所以即使檔案能共用並不代表編譯就能通過,故必須要有個方式讓程式遇到特定不相容的地方能夠用不同方式撰寫處理,並讓編譯器了解該如何編譯
譬如
動態載入相關組件的方式,Silverlight與dotnet方式差異很大.
這時候就可以透過VS的MACRO功能來解決這個問題
譬如底下程式
#if SILVERLIGHT
Assembly a = typeof(System.Action).Assembly;
type = a.GetType(typeName, false);
if (type != null)
return type;
foreach (System.Windows.AssemblyPart ap in System.Windows.Deployment.Current.Parts)
{
System.Windows.Resources.StreamResourceInfo sri = System.Windows.Application.GetResourceStream(new Uri(ap.Source,UriKind.Relative));
Assembly assembly = new System.Windows.AssemblyPart().Load(sri.Stream);
type = assembly.GetType(typeName, false);
if (type != null)
return type;
}
#else
// First - try all loaded types
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
type = assembly.GetType(typeName, false, true);
if (type != null)
return type;
}
#endif
當編譯編譯Silverlight專案時就會採用#if SILVERLIGHT區塊之程式,反之就是dotnet