今天在學習插件系統設計的時候遇到一個問題:“System.Reflection.ReflectionTypeLoadException: 無法加載一個或多個請求的類型。
於是百度一下,很多內容都差不多,摘抄一個:
------------------------------
今天突然遇到“System.Reflection.ReflectionTypeLoadException: 無法加載一個或多個請求的類型。有關更多信息,請檢索 LoaderExceptions 屬性。”這樣的報錯,找了好長時間,上網搜索按照他們的方法好像都不能解決問題。
於是坐下來仔細一想,自己只是改了接口,多了個方法,重新生成解決方案,沒有錯誤,但是在去反射繼承這個接口的dll時忘了替換掉原來的這幾個文件,反射 時原來的DLL少了一個方法,這樣反射時就會錯誤。把重新生成的DLL復制到反射的目錄下,結果問題解決了,記下來,以后出現這個問題好去解決^o^!
------------------------
重新拷貝了一份還是不行,於是也靜靜地想了半天,才發現因為是隨便測試一 下,所以在建程序時,把接口在宿主中建立了,后來覺得不妥,又把這個文件拖動到新建的類庫里。而在宿主中聲明時沒有加入限定詞(命名空間)所以結果是插件 里與宿主里用的接口內容雖然是一樣的。但命名空間是不一樣的。故出現上述問題。
唉,用以前一位同事的話說就是自己給自己下絆把自己拌倒,哈哈。挺繞口的。看來以后真的要多加注意了!
****
LoaderException的解決方法
一、問題描述:
利用反射機制得到程序集的所有類型,常常會出現下面的問題。代碼如下:
Assembly pAssembly = System.Reflection.Assembly.LoadFile(pfilepath);
Type[] pTypes = pAssembly.GetTypes(); //運行到這個地方會彈出如下錯誤描述
錯誤描述如下:
“未處理 System.Reflection.ReflectionTypeLoadException Message="無法加載一個或多個請求的類型。有關更多信息,請檢索LoaderExceptions屬性。”
二、問題分析:
小弟我在一個項目中寫一些類,編譯生成了一個dll,利用反射機制得到了它的所有類型,運行正常。后來再加了一個類A,其繼承自類B(類B位於另一 個項目中),再編譯生成,一切OK。可是利用自己編寫的反射工具去得到它的類型時卻出現上述錯誤,迷惑了一陣子,心中大呼:怪哉!后來終於找到問題元凶, 請看下述解決方法。
三、解決方法:
問題的主要原因出在:跨程序集反射。
即我們需反射的A.dll的程序集引用B.dll程序集,而在反射工具項目中卻不存在對B.dll程序集的引用。因此我們只需在反射工具項目中添加對B.dll的引用即可,或者將B.dll拷貝到反射工具的執行目錄下。
