gpt4 book ai didi

c# - C# 中的接口(interface)和后期绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:17 24 4
gpt4 key购买 nike

我之前在 C# 中为一个工作正常的插件系统做过这件事,这就是为什么我对为什么这个新的、独立的插件系统没有按我预期的方式工作感到困惑。

我有我的插件程序集——我们称之为“plugin.dll”,我有我的主程序集——我们称之为 App.exe。

我有一个名为IMyObject 的接口(interface)及其实现MyObject,两者都在plugin.dll 中定义。我已将 IMyObject 的确切代码文件(插件开发人员提供给我)复制到我的主 App.exe 程序集中。

当我尝试将使用反射加载的对象转换为该对象实现的接口(interface)时,我得到了一个InvalidCastException。我知道对象实现了它,因为

t.GetInterface(typeof(IMyObject).FullName) != null

是真的。我还可以在 Visual Studio 的对象资源管理器中浏览 MyObject,我可以看到它实现了 IMyObject

这里是错误的地方:

 if (ifaceType != null)
{
ConstructorInfo constructor = ifaceType.GetConstructor(new Type[] { });

if (constructor != null)
{

object obj = constructor.Invoke(null); // this works - obj is assigned an
// instance of MyObject

IMyObject myObj = (IMyObject)obj; // triggers InvalidCastException
}
}

我能看到我现在所做的和我以前实现它的方式之间的唯一区别是接口(interface)是在两个单独的程序集中定义的(即使代码文件是相同的并且它们属于同一个命名空间)。

这就是我遇到麻烦的原因吗?如果是这样,我如何在不在编译时链接的情况下连接到我的插件,并使用插件本身定义的接口(interface)?

我应该补充一点,除了界面之外,我无权访问插件的源代码。

最佳答案

尽管这些接口(interface)具有相同的代码,但它们是两个不同程序集中的两个独立接口(interface)(您可以打印它们的 AssemblyQualifiedNames 并查看差异)。

关于c# - C# 中的接口(interface)和后期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com