gpt4 book ai didi

c# - IsAssignableFrom(甚至是 ImplementInterface)是如何工作的

转载 作者:行者123 更新时间:2023-11-30 15:19:37 25 4
gpt4 key购买 nike

我有一个来自 stackoverflow 的 c# 插件系统。关键部分是Assembly.LoadFile、Type.IsAssignableFrom和Activator.CreateInstance。它有效,但是我不完全理解 IsAssignableFrom 如何识别从外部程序集加载的类型。说,我有

public interface PluginInterface 
{
int calculateSomething();
}

我已经将它编译成 PluginInterface.dll。

PluginInterface.dll 是示例插件中的引用,例如:

public class CalculateOnePlugin : PluginInterface
{
public int calculateSomething() { return 1; }
}

编译成CalculateOnePlugin.dll。

现在,引用 PluginInterface.dll 创建一个应用程序,并尝试加载和使用 CalculateOnePlugin.dll:

var pluginAssembly = Assembly.LoadFile("CalculateOnePlugin.dll");
Type interfaceType = typeof(PluginInterface);
Type[] typesInLoadedAssembly = pluginAssembly.GetTypes();
Type pluginType = null;
foreach (var typeInLoadedAssembly in typesInLoadedAssembly)
if (interfaceType.IsAssignableFrom(typeInLoadedAssembly)) // ???
{
pluginType = typeInLoadedAssembly;
break;
}
if (pluginType!=null)
{
PluginInterface pi = (PluginInterface)Activator.CreateInstance(pluginType);
// and do what you want with that plugin object
}

我的问题是 IsAssignableFrom 如何识别和匹配从两个外部程序集加载的类型? IsAssignableFrom 考虑了哪些程序集或类属性?

如果我复制 PluginInterface 的源并将其编译成(例如)AnotherPluginInterface.dll 并在构建 CalculateOnePlugin.dll 时使用此引用,那么它将无法工作。因此类型匹配不仅仅关心方法签名,例如,它以某种方式知道程序集的来源和类型。

当我为应用程序和插件使用两个不同版本的 PluginInterface 时(假设为后者添加了一个方法)它不会再次工作,所以这两个 dll 的来源是不够的,它必须有一些版本里面的东西。

但简单地重新编译两种用法(应用程序和插件)之间的 PluginInterface 不会造成困惑,它可以工作。

PluginInterface.dll 的 GUID 是否包含在 CalculateOnePlugin.dll 的引用中,这就是 IsAssignableFrom 知道它们相同的方式吗?或者类型使用类似散列的值?还是两者兼而有之?

最佳答案

在引擎盖下有一个复杂的程序集解析过程,其中引用的类型要么映射到已加载的程序集,要么导致动态加载必要的程序集。当您加载插件时,这可能会有点棘手,尤其是当您有多个位置存在引用程序集时。这可能会导致奇怪的情况,例如加载同一程序集的两个副本(一个来自您的主文件夹,另一个来自您的插件文件夹),然后由于加载所有这些类型的两个不同的不兼容副本而导致运行时错误。

实际匹配过程通常使用 George Vovos 的回答中提到的完全限定名称,尽管有类似 binding redirects 的东西这会使情况复杂化。

您可以使用 AppDomain.AssemblyResolve 自定义程序集解析过程。事件。如果您正在创建一个插件系统,那么对程序集解析过程进行一些研究是非常值得的,因为存在一些陷阱,尤其是当您执行诸如“实时”重新加载插件的更新版本之类的操作时。

关于c# - IsAssignableFrom(甚至是 ImplementInterface)是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41945997/

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