代码之家  ›  专栏  ›  技术社区  ›  Mario M.

在运行时实例化程序集时未找到构造函数

  •  -1
  • Mario M.  · 技术社区  · 7 年前

    加载DLL并获取类型后,我在尝试实例化它时遇到异常:

    Assembly dll = Assembly.LoadFrom(@"C:\path\file.dll");
    Type type = dll.GetType("namespace.CustomClass");
    object obj = Activator.CreateInstance(type); // <-- System.MissingMethodException
    

    “没有为此对象定义具有0个参数的构造函数”(平均转换)

    探索加载的类型,我可以看到 DeclaredConstrunctors -&燃气轮机; {Void .ctor()}

    但是打电话 type.GetConstructors() 我得到一个空数组(我想这意味着只有默认构造函数存在?)

    我既没有找到任何返回类的对象的工厂类,也没有找到 getInstance 作用

    知道如何继续吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   EJoshuaS - Stand with Ukraine    7 年前

    这里有一些可能性。

    首先,所有定义的参数都采用参数。不能保证每个类都有一个0参数构造函数。下面是产生此错误的一些代码的示例:

    public class SomeCons
    {
        public SomeCons(string cons)
        {
    
        }
    }
    
    static void Main(string[] args)
    {
        object result = Activator.CreateInstance(typeof(SomeCons));
    }
    

    第二种可能性 namespace.CustomClass 具有专用构造函数。下面的代码生成与您所看到的类似的行为。我还提供了一个如何找到实际构造函数的示例—您希望 use Binding Flags .

    private class NoCons
    {
        private NoCons()
        {
    
        }
    }
    
    static void Main(string[] args)
    {
        // As you saw, this shows one declared constructor
        Type exploratory = typeof(NoCons);
    
        // Returns nothing
        ConstructorInfo[] constructors = typeof(NoCons).GetConstructors();
    
        // Returns 1 constructor
        constructors = typeof(NoCons).GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    }
    

    请注意,准确理解可能很重要 为什么? 命名空间。自定义类 首先有一个私有构造函数。如果您试图定义一个单例,那么这实际上是一件非常常见的事情,在这种情况下,您可能不想直接调用构造函数。

    对于这样的单身汉:

    private class NoCons
    {
        private NoCons()
        {
    
        }
    
        private static NoCons _instance;
    
        public static NoCons Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new NoCons();
                }
    
                return _instance;
            }
        }
    }
    

    尝试以下操作:

    Type exploratory = typeof(NoCons);
    
    PropertyInfo singletonProperty = exploratory.GetProperties(BindingFlags.Static | BindingFlags.Public).FirstOrDefault(prop => prop.Name.Contains("Instance"));
    
    string name = singletonProperty.GetGetMethod().Name;
    
    var noCons = exploratory.GetMethod(name).Invoke(null, null) as NoCons;
    
        2
  •  0
  •   Mario M.    7 年前

    DLL在另一个文件夹中放置了一个相关的OCX文件。

    文件已通过以下方式注册:

    Regsvr32。\文件。ocx公司

    之后,我能够实例化一个对象调用:

    使用Microsoft。VisualBasic;

    MyAssemblyName对象=(MyAssemblyName)交互。CreateObject(“MyNamespace.MyAssemblyName”,“”);