星期五, 10月 17, 2014

不是強式名稱就夠了

.NET 的組件相依、參考等問題一直不是很好處理,其中最大的原因應該是出問題時的錯誤訊息很不直覺,過去的經驗總以為嚴守「不進 GAC」、「強式名稱」兩原則就可以清楚的找出用錯組件的問題,但這次又嚇到了!狀況是:使用端參考了一個 A 組件,內有界面與類別實作,簡化後的虛擬碼如下:
  • using com.abc;
  • public IA getA() {
  •     Assembly a = Assembly.LoadFrom("A.dll");
  •     Type t = a.GetType("com.abc.A");
  •     Object o = Activator.CreateInstance(t);
  •     return (IA)o;
  • }
上面這段程式,永遠會在第六行拋出 InvalidCastException,著實令人納悶?用 ildasm.exe 確認過 A.dll 的確有 IA 介面與 A 類別實作,強式名稱與上述程式所參考的也一模一樣,怎麼會有這麼奇怪的錯誤呢?後來看到這篇才令我恍然大悟了,原來第六行的 o 在 Load-From Context, IA 在 Default Context,所以就互相看不到對方,當然就轉不過去啦!
但至今仍不解的是,另外開了個小專案想要重現這個問題,但這錯誤又不會發生?到底還有什麼是我還不知道的?

沒有留言:

張貼留言