2017-02-15 98 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和我的项目使用的类型 –