我正在使用反射从源代码下面的dll调用方法
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类型”。
最佳答案
我假设正在执行的程序集的configurationObjectsImport类型为Phenix_Import_Commun.Domaine.ConfigurationObjectsImport
,但是CustomImport.Import.ExecImport
期望的类型与AssemblyName.dll
具有相同的名称和名称空间。这是两种不同的类型,碰巧具有相同的名称(这是非常不希望的)。
如果您确实在两个具有相同名称的不同程序集中拥有两种不同类型,并且想要执行此操作和/或没有更改此功能的能力,则需要使用Phenix_Import_Commun.Domaine.ConfigurationObjectsImport
的反射来创建AssemblyName.dll
对象>并传入。
另一方面,如果您希望它们具有相同的类型,则需要在两个程序集都通用的程序集中定义该类型(定义该类型的第三个程序集,如果AssemblyName.dll
,则为执行程序集)引用),并且只有该名称的一种类型定义。