2017-02-15 99 views
1

我使用反射來從DLL調用一個方法,源代碼.NET Framework 3.5的反射問題

ConfigurationObjectsImport configurationObjectsImport; 

Assembly asm; 
asm = Assembly.LoadFrom("AssemblyName.dll"); 
object obj; 
Type TYP; 
TYP = asm.GetType("CustomImport.Import"); 
obj = Activator.CreateInstance(TYP); 
MethodInfo methodInf = obj.GetType().GetMethod("ExecImport"); 
object[] args = new object[1]; 
args[0] = configurationObjectsImport; 
methodInf.Invoke(obj, args); 

類ConfigurationObjectsImport在兩個當前項目和DLL重複使用相同的空間名稱下方,但methodInf.Invoke(obj,args);拋出異常「不能將類型Phenix_Import_Commun.Domaine.ConfigurationObjectsImport轉換爲類型Phenix_Import_Commun.Domaine.ConfigurationObjectsImport」。

+3

如果類型在不同的程序集中,即使它們具有相同的名稱,它們也是*不是同一類型。 – Amy

+1

爲什麼你會在dll中和你的項目中有一個完全相同的命名空間的類?這沒有任何意義。 – bc004346

+1

@ bc004346如果您認爲框架對待它們,它確實有意義。它是一種常見的誤解,即如果類型看起來完全相同,它們是相同的。 – Amy

回答

4

我假設configurationObjectsImport的類型是Phenix_Import_Commun.Domaine.ConfigurationObjectsImport從執行程序集,但CustomImport.Import.ExecImport期待從AssemblyName.dll相同的名稱和命名空間的類型。這是兩種不同的類型,碰巧有相同的名字(這是非常不可取的)。

如果您確實在兩個不同的程序集中有兩個不同的類型,並且名稱相同,並且您想這樣做和/或無法更改此類型,則需要使用反射來創建一個Phenix_Import_Commun.Domaine.ConfigurationObjectsImport對象AssemblyName.dll,並通過它。

如果另一方面,你打算他們是相同的類型,你將需要在一個程序集中定義這種類型,這個程序集對於兩個程序集是共同的(第三個程序集定義類型或正在執行的程序集,如果AssemblyName.dll引用它)並且只有該名稱的一個類型定義。

+0

謝謝我將使用第三個程序集,它定義了ddl和我的項目使用的類型 –