创建一个在dll中定义的对象,我没有
问题描述:
的引用我有一个dll的完整路径,但不是引用,我需要实例化一个实现了我定义的接口的对象。 我确实拥有对其他dll的控制权,所以我可以像dll那样执行一些静态函数来返回我需要的对象。我不知道如何调用这个函数,或者即使我正在接近这个权利。创建一个在dll中定义的对象,我没有
答
您需要手动加载该程序集,然后使用反射来找到并执行你感兴趣的方法Here's an article.
有趣的来电/该条声明:
调用
Assembly.Load()
让运行时将程序集加载到AppDomain中(使其成员可调用)。在搜索包含在组件中的
Type
小号建筑
MethodInfo
和ConstructorInfo
对象,这是用于调用一个方法或实例化一个实例的反射成分,分别在
MethodInfo
调用.Invoke()
或ConstructorInfo
。Invoke()
实质上是在告诉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
道歉发现它在VB.net是,你可能有一点小麻烦,改成VB.net,因为它没有做什么特别神秘=) – Rob 2010-07-23 14:18:13
没有任何问题,我一般更喜欢C#。这个项目恰好在VB中。 – JupiterP5 2010-07-23 15:35:41