gpt4 book ai didi

c# - 如何从 DLL 访问带有接口(interface)的类?

转载 作者:太空宇宙 更新时间:2023-11-03 12:32:02 27 4
gpt4 key购买 nike

我正在开发一个使用插件的程序。所有插件都是继承自 KrotAPI.IKrotAPI 接口(interface)的类。该接口(interface)存储在 krotapi.cs 文件中,该文件对于主机的 csproj 和每个插件的 *.csproj 都是通用的。

主机使用此代码加载插件

dynamic LoadPlugin(Assembly asm)
{
foreach (Type type in asm.GetTypes())
{
if (type.GetInterface("KrotAPI.IKrotPlugin") != null)
{
PluginType = type;
dynamic inst = Activator.CreateInstance(type);
KrotAPI.IKrotPlugin inst2 = inst as KrotAPI.IKrotPlugin;
if (inst2 == null) return inst;
Console.WriteLine("Link to API is set up.");
return inst2;
}
}
throw new Exception("There are no valid plugin(s) in the DLL.");
}

inst2 始终为空,我被迫使用缓慢且有问题的动态调用。如何让它像 inst 一样,但使用 KrotAPI.IKrotPlugin 类型?


关于几乎相同主题的第二个问题。一些插件的函数返回 KrotAPI.FindData 类型的结果(它是一个结构,存储在上面的 krotapi.cs 文件中)。但我无法访问它:

dynamic fd = new KrotAPI.FindData();
if (NextItemInfo != null) //NextItemInfo is an instance of that struct
fd = NextItemInfo;
listBox1.Items.Add(fd.FileName);

在最后一行 NET Framework 抛出这个异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 'System.ValueType' does not contain a definition for 'FileName'

但是 FileName 字段在结构中是硬编码的,当然不是 null,或者

Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException An unexpected exception occurred while binding a dynamic operation

如果我将最后一行替换为 KrotAPI.FindData fd2 = (KrotAPI.FindData) fd; listBox1.Items.Add(fd2.FileName);.

什么鬼?

最佳答案

您在主机和插件中定义了IKrotAPI 接口(interface)。这意味着它们不是同一个接口(interface)。包含程序集是接口(interface)完整标识的一部分。您的每个插件实际上都在实现一个在其自己的程序集中定义的接口(interface),这与在主机程序集中定义的接口(interface)不同。

有两种方法可以解决这个问题:

  1. 让您的插件为 IKrotAPI 接口(interface)引用主机程序集。
  2. 仅为主机和服务器通用的接口(interface)和数据类型(例如 KrotAPI.FindData)创建第三个程序集。

我个人更喜欢第二种方法。它允许您在不使现有插件失效的情况下升级主机程序集。要对此类程序集使用通用命名约定,可以将第三个程序集称为 KrotAPI。我倾向于将“API”视为某人(即插件开发人员)将针对其进行编码的一组接口(interface)和数据类型,但在您的情况下,所有实际可运行的代码都将位于主机或插件中。

关于c# - 如何从 DLL 访问带有接口(interface)的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376539/

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