C# 从从基类继承的指定程序集中实例化实例-显然是一个非常困难的问题
我有一门课:C# 从从基类继承的指定程序集中实例化实例-显然是一个非常困难的问题,c#,reflection,inheritance,C#,Reflection,Inheritance,我有一门课: public abstract class SendAgencyFileComponent : ISendAgencyFileComponent { public AgencyOutput agencyOutput; public TDXDataTypes.DB.Entity client; public TDXDataTypes.DB.Entity agency; public SendAgencyFileComponent(AgencyOutp
public abstract class SendAgencyFileComponent : ISendAgencyFileComponent
{
public AgencyOutput agencyOutput;
public TDXDataTypes.DB.Entity client;
public TDXDataTypes.DB.Entity agency;
public SendAgencyFileComponent(AgencyOutput agencyOutput, TDXDataTypes.DB.Entity client, TDXDataTypes.DB.Entity agency)
{
this.agencyOutput = agencyOutput;
this.client = client;
this.agency = agency;
}
}
我有许多从这个类继承的类,它们驻留在各种DLL中(包括从中调用的类,但位于不同的位置)。我需要能够从DLL位置和类名实例化这个类的实例。目前我正在使用:
System.Reflection.Assembly assembly =
System.Reflection.Assembly.LoadFrom(
"C:\\Program Files\\RMIS\\" + format.AssemblyName + ".dll");
return assembly.CreateInstance(
format.ClassName,
true,
System.Reflection.BindingFlags.CreateInstance,
null,
new Object[] { agencyOutput, client, agency },
System.Globalization.CultureInfo.CurrentCulture,
null
) as DotNet_WS_Components.ISendAgencyFileComponent;
但我一直在犯错误:
找不到类型“TDXDataTypes.DotNet\u WS\u Components.InternationalAgencyFileOut”的构造函数
我确信我的参数与构造函数完全匹配,当使用Activator.CreateInstance从同一程序集加载类时,它工作正常:
System.Runtime.Remoting.ObjectHandle sendFilehandle =
Activator.CreateInstance(
format.AssemblyName,
format.ClassName,
true,
System.Reflection.BindingFlags.CreateInstance,
null,
new Object[] { agencyOutput, client, agency },
System.Globalization.CultureInfo.CurrentCulture,
null,
null);
return (TDXDataTypes.DotNet_WS_Components.ISendAgencyFileComponent)sendFilehandle.Unwrap();
我目前正在研究的一个具体例子是:
Webservice
-> calls TDXDataTypes dll method through referenced DLL
-> calls TDXDataTypes dll class (above) using reflection from a different folder
介绍
->通过引用的dll调用TDXDataTypes dll方法
->使用来自不同文件夹的反射调用TDXDataTypes dll类(如上)
TDXDataTypes.DotNet\u WS\u Components.InternationalAgencyFileOut
的构造函数(或构造函数)是什么样子的?听起来好像没有一个构造函数接受您传递的三个参数。它们是否与类的构造函数中的预期参数类型相同
更新
关于您的第二个代码示例;在这两个示例中,您有一组完全不同的BindingFlags。失败的指定为
BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly
,而工作的只使用BindingFlags.CreateInstance
。是否正是这种差异导致了一个失败,一个成功?因为你给出的两个示例中的绑定标志有偏差,而且错误的绑定标志会给你带来声明的异常,我猜这是你的问题
更新:
如果不是acse,我会比较组件版本
System.Reflection.Assembly assembly =
System.Reflection.Assembly.LoadFrom(
"C:\\Program Files\\RMIS\\" + format.AssemblyName + ".dll");
可能不会返回调用Activator所使用的程序集的相同版本(甚至是相同的程序集),因此存在类型定义不同的潜在风险
尝试转储可以创建和比较的ISendAgencyFileComponent对象的format.ClassName、assembly name/version/culture/key hash(从LoadFrom调用)和obj.GetType().AssemblyQualifiedName的值
对于对同一程序集中的类的任何调用,我使用Activator.CreateInstance,对于对不同DLL的任何调用,我使用另一种方法。构造函数与SendAgencyFileComponent的构造函数完全相同。我会猜到同样的事情。应该仔细检查程序集和名称,并确保调用的是预期的gwin。@David-使用Activator.CreateInstance使用几乎完全相同的方法参数(我将把这个示例添加到问题中),它可以正常工作,因此我确定这与远程DLL有关。构造函数是公共的?(只是双重/三重检查)是的,构造函数在抽象类和继承类上都是公共的。我已经尝试了许多绑定标志的兼容,包括在两个调用上使用相同的绑定标志,其中一个版本正常,另一个版本不正常。程序集版本可能是问题所在,但我记得我在两个地方都部署了相同的构建,看看这是否有效。我现在有一个解决办法,但谢谢你的帮助。