创建一个在dll中定义的对象,我没有

问题描述:

的引用我有一个dll的完整路径,但不是引用,我需要实例化一个实现了我定义的接口的对象。 我确实拥有对其他dll的控制权,所以我可以像dll那样执行一些静态函数来返回我需要的对象。我不知道如何调用这个函数,或者即使我正在接近这个权利。创建一个在dll中定义的对象,我没有

您需要手动加载该程序集,然后使用反射来找到并执行你感兴趣的方法Here's an article.

有趣的来电/该条声明:

  • 调用Assembly.Load()让运行时将程序集加载到AppDomain中(使其成员可调用)。

  • 在搜索包含在组件中的Type小号

  • 建筑MethodInfoConstructorInfo对象,这是用于调用一个方法或实例化一个实例的反射成分,分别

  • MethodInfo调用.Invoke()ConstructorInfoInvoke()实质上是在告诉Reflection来执行相应的方法。

您可以在运行时加载组件,并使用System.Activator或reflection来实例化该组件中的类型。如果你正在寻找一个实例的类型没有默认的构造函数,那么你必须传递正确的参数。这可能是棘手的问题,但如果类型很容易构建(使用相同的方法),这也很简单。 如果您正在调用构造此类型的方法,那么它将在成功时返回对象。 我怀疑你指的接口不是严格的.Net接口,而是一组访问类型的公共方法。你也可以使用反射来调用这些。

下面是我使用的一段代码,剥离了公司特定的内容。一旦你加载了程序集(如果这段代码为你加载程序集,我记不起头脑),这是一种享受。

public static IMyType GetInstanceOfMyType() 
{ 
    var myTypeDescriptor = "My.Fully.NameSpaced.TypeName, My.Assembly.Name, Version=1.0.0.0, Culture=neutral" 

    IMyType _instance = null; 

    try 
    { 

    var myType = Type.GetType(myTypeDescriptor, true, true); 
    if (inst.GetInterface("IMyType") != null) 
    { 
     // For a constructor that takes a single parameter, that's a string 
     var constructorInfo = myType.GetConstructor(new Type[] { typeof(string) }); 
     _instance = (IMyType)constructorInfo.Invoke(new object[] { "String to Pass To Constructor" }); 

    } 
    else 
    { 
     // Type isn't correct, complain here. 
    } 
    } 
    catch (Exception ex) 
    { 
     // Log any errors here 
    } 

    return _instance; 
} 

的“任何错误”通常是一个:

  • 你已经在myTypeDescriptor命名不存在
  • 你已经在myTypeDescriptor命名类型不类型实现IMyType
  • 您在myTypeDescriptor中命名的类型没有与您在调用GetConstructor时指定的类型相匹配的构造函数
  • 构造函数抛出异常;如果是这样,它可以在ex.InnerException
+0

道歉发现它在VB.net是,你可能有一点小麻烦,改成VB.net,因为它没有做什么特别神秘=) – Rob 2010-07-23 14:18:13

+0

没有任何问题,我一般更喜欢C#。这个项目恰好在VB中。 – JupiterP5 2010-07-23 15:35:41