C# 使用字符串到接口的GetType

C# 使用字符串到接口的GetType,c#,dll,interface,gettype,C#,Dll,Interface,Gettype,我已经为控件DLL创建了一个DLL加载程序(这些控件具有相同的接口iControlPlugin),一切都很好。但是,我现在需要为设备驱动程序创建一个DLL加载程序。我开始查看我的控件加载程序代码,意识到除了定义了接口类型之外,代码是相同的。因此,我希望使我的控件加载器函数更通用,以便它可以用于不同的接口类型 我修改了这个函数,使它返回一个字典,我遇到的问题是我做了一个检查,以确保DLL文件包含一个匹配的类型,在我的例子中,这是两种接口类型之一。但我总是得到空值 这是我最初的工作函数,专门针对一种

我已经为控件DLL创建了一个DLL加载程序(这些控件具有相同的接口iControlPlugin),一切都很好。但是,我现在需要为设备驱动程序创建一个DLL加载程序。我开始查看我的控件加载程序代码,意识到除了定义了接口类型之外,代码是相同的。因此,我希望使我的控件加载器函数更通用,以便它可以用于不同的接口类型

我修改了这个函数,使它返回一个字典,我遇到的问题是我做了一个检查,以确保DLL文件包含一个匹配的类型,在我的例子中,这是两种接口类型之一。但我总是得到空值

这是我最初的工作函数,专门针对一种类型(iLPPControlPlugin)

但是问题是myType总是空的。我尝试过许多不同的变体,但都不走运。我相信这会很简单,但谁能告诉我我做错了什么。有关信息,PluginInterface命名空间和iLPPControlPlugin类是解决方案中的一个项目

非常感谢,,
Chris

带有
插件接口。不会解析iLPPControlPlugin
类型。您还必须在
Type.GetType()
的参数中指定程序集名称
PluginInterface.iLPPControlPlugin,MyAssembly
(有关详细信息,请参阅)

来自MSDN关于:

如果typeName包含名称空间,但不包含程序集名称,则此方法仅按该顺序搜索调用对象的程序集和Mscorlib.dll。如果typeName使用部分或完整程序集名称完全限定,则此方法将在指定程序集中搜索。如果程序集具有强名称,则需要完整的程序集名称

请注意,您甚至可以仅使用接口名称执行搜索,您必须使用而不是
Type.GetInterfaces()
:它接受一个带有接口名称的字符串参数:

if (type.GetInterface(interfaceType) != null)
{
    // ...
}

注意:如果您不需要处理带有泛型参数的接口(请参阅
Type.GetInterface()
文档了解命名约定),带有
PluginInterface.iLPPControlPlugin
类型将不会被解析,那么这一点非常有效。您还必须在
Type.GetType()
的参数中指定程序集名称
PluginInterface.iLPPControlPlugin,MyAssembly
(有关详细信息,请参阅)

来自MSDN关于:

如果typeName包含名称空间,但不包含程序集名称,则此方法仅按该顺序搜索调用对象的程序集和Mscorlib.dll。如果typeName使用部分或完整程序集名称完全限定,则此方法将在指定程序集中搜索。如果程序集具有强名称,则需要完整的程序集名称

请注意,您甚至可以仅使用接口名称执行搜索,您必须使用而不是
Type.GetInterfaces()
:它接受一个带有接口名称的字符串参数:

if (type.GetInterface(interfaceType) != null)
{
    // ...
}

注意,如果您不需要处理带有泛型参数的接口(请参阅
Type.GetInterface()
命名约定文档),那么这将非常有效。

好的,现在这听起来非常愚蠢。。。。大会是什么?这是我要检查的类型的程序集吗?在这种情况下,如何指定它?或者它是指作为已加载的DLL文件的程序集?(我想它不能是后者,因为这是一个未知的类型,这就是我检查它的原因)。非常感谢,是的,“类型:GetInterface(In FruteType)= NULL):但是,就我的理解而言,汇编在我的情况下是什么?@ ToeGraveSy它是程序集(为了简单起见,它是DLL的同义词)。它包含接口(必须由插件实现)。名称搜索可以工作,但要准备好捕捉异常,以防出现歧义。当然,使用GetType(),LoadPlugins()的调用方可以使用它LoadPlugins(folderName,typeof(MyInterface).Name),所以您不需要关心名称(也不必硬编码)。但这不是iLPPControlPlugin吗?这意味着调用将是“Type myType=Type.GetType(“PluginInterface.iLPPControlPlugin,iLPPControlPlugin”);”?@TheGrovesy如果“iLPPControlPlugin”是DLL的名称,那么是的。好吧,现在这听起来真的很愚蠢。。。。大会是什么?这是我要检查的类型的程序集吗?在这种情况下,如何指定它?或者它是指作为已加载的DLL文件的程序集?(我想它不能是后者,因为这是一个未知的类型,这就是我检查它的原因)。非常感谢,是的,“类型:GetInterface(In FruteType)= NULL):但是,就我的理解而言,汇编在我的情况下是什么?@ ToeGraveSy它是程序集(为了简单起见,它是DLL的同义词)。它包含接口(必须由插件实现)。名称搜索可以工作,但要准备好捕捉异常,以防出现歧义。当然,使用GetType(),LoadPlugins()的调用方可以使用它LoadPlugins(folderName,typeof(MyInterface).Name),所以您不需要关心名称(也不必硬编码)。但这不是iLPPControlPlugin吗?这意味着调用将是“typemytype=Type.GetType(“PluginInterface.iLPPControlPlugin,iLPPControlPlugin”);”?@TheGrovesy如果“iLPPControlPlugin”是DLL的名称,那么是。
Type myType = Type.GetType("PluginInterface.iLPPControlPlugin");
if (type.GetInterfaces().Contains(myType))
Type myType = Type.GetType("PluginInterface.iLPPControlPlugin, MyAssembly");
if (type.GetInterfaces().Contains(myType))
if (type.GetInterface(interfaceType) != null)
{
    // ...
}