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有关。构造函数是公共的?(只是双重/三重检查)是的,构造函数在抽象类和继承类上都是公共的。我已经尝试了许多绑定标志的兼容,包括在两个调用上使用相同的绑定标志,其中一个版本正常,另一个版本不正常。程序集版本可能是问题所在,但我记得我在两个地方都部署了相同的构建,看看这是否有效。我现在有一个解决办法,但谢谢你的帮助。