我有一个类(TabControlH60),它既继承自基类(UserControl)又实现了一个接口(IFrameworkClient)。我使用 .NET Activator 类实例化该对象。使用返回的实例,我可以转换为 UserControl 基类,但不能转换为接口。我得到的异常位于代码片段下方。如何投射到界面?
object obj = Activator.CreateInstance(objType);
Type[] interfaces = obj.GetType().GetInterfaces(); // contains IFrameworkClient
m_Client = (UserControl)obj; // base class cast works
IFrameworkClient fc = (IFrameworkClient)obj; // interface cast fails
// Note: The (IFrameworkClient)obj cast works fine in the debugger Watch window.
{"Unable to cast object of type 'FPG.H60.AFF.TabControlH60' to type
'FPG.AFF.Interfaces.IFrameworkClient'."}
我的一个提供“插件”功能的库也有同样的问题......我终于让它工作了......
这是我的问题:我有一个使用插件的主程序集,一个带有插件的程序集(Plugin.dll)和(重要的)另一个提供插件功能的程序集(Library.dll)。
Plugin.dll 引用了主程序集(以便能够扩展它)和带有插件函数的 Library.dll。 - 它的二进制文件位于相对于主程序集的目录“./Plugins”。
主程序集还引用了插件函数。程序集是为了使用“PluginManager”而编写的。这个“PluginManager”获取路径并通过反射加载所有 *.dll 文件,以便分析是否存在“IPlugin”接口(也来自 Library.dll)。
每次我调用 PluginManager 加载插件时,它都无法将它们转换为“IPlugin”,尽管它们实现了它。
我几乎要生气了——但后来我发现了整个问题。通过编译插件,不仅将“Plugin.dll”写入“./Plugins”目录,而且还将“Library.dll”写入“./Plugins”目录。通过每次使用我的 PluginManager 意外加载“Library.dll”,我现在有两种类型的“IPlugin” - 一种在主程序集中使用的实际“Library.dll”中,另一种是通过我的 PluginManager 加载的 - 并且这些是不兼容的!
注意 - 如果您不加载“./Plugins/Library.dll”,您仍然会遇到问题 - 因为如果您加载引用“Library.dll”的“Plugin.dll”,那么它只会使用同一目录中的那个。 ..倾斜...!!我的 PluginManager 现在只是删除它找到的“Library.dll”。
线索是:确保不要在不同的上下文中访问两个程序集!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)