- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个来自 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/
我想更好地理解 Java 中基本类型和引用类型之间的 isAssignableFrom 行为。 例如: System.out.println(boolean.class.isAssignableFro
我有两个 java 类,如下所示, public class Class1{ private Object actionObject; public Object getActi
不确定我是否可以这样做,但我正在尝试查看一个类型是否继承自具有泛型约束的另一个类型。 这是我要查找的类: public class WorkoutCommentStreamMap : ClassMap
我有一些第三方类(class)。其精简版(为了简洁起见)功能如下: 提供两个类 ClassA 和 ClassB 供外部使用。这些类中的每一个类都与其他类完全无关(这意味着它们没有共同的祖先)。 有一个
我想更好地理解 Java 中基本类型和引用类型之间的 isAssignableFrom 行为。 例如: System.out.println(boolean.class.isAssignableFro
我如何检测类型 x 是否可从类型 y 分配,不仅通过继承层次结构而且通过协变和逆变? 最佳答案 IsAssignableFrom 会检查协变和逆变,您不需要任何其他东西: // Covariance
我有下一个代码: private T CreateInstance(object obj) // where T : ISomeInterface, class { ... if (!
在我写的使用反射的代码中 if (f.FieldType.IsAssignableFrom("".GetType())) 我有一个隐式转换为字符串的类。但是上面的 if 语句没有捕捉到它。如何通过隐式
在 Kotlin (1.0.6) 中,通过反射我需要迭代一个类的成员(我们称之为 Foo),并根据返回类型做一些事情。我可以编写以下内容,它有效: Foo::class.members{ m ->
我真的对这种行为感到困惑。在 JBoss 7 中,我使用 @Entity 注释检索所有类,然后我需要找到所有实现接口(interface)“BusinessObject”的类。 这是实现它的方法:
我正在查看 java.lang.Class#isAssignableFrom来自 Java Reflection in Action . 为什么 Object.class.isAssignableFr
我正在使用 COM-API,Autodesk Inventor。 此测试通过: [Test] public void CastTest() { Inventor.Document docume
我正在尝试创建一个通用包装器来包装所有类型的值并提供一些额外的功能。 包装器看起来像: class PropertyWrapper { private T _value; publi
给定一个 Class 对象,我如何检查它的“祖先”之一是否是某个类?有多次调用 getSuperClass 的替代方法吗? 最佳答案 给定一个类 c1,您想知道它的祖先之一是否是 c2? 不会 c2.
所以我想检查一个类是否可以分配给包含许多子类的父类(super class),像这样 public class A { public A(){ } } public class B exten
我发现原始类型问题 System.out.println("Integer.class.isAssignableFrom(int.class) = " + Integer.class.isAssign
int i=1; long longOne=i; //assignment works fine //...but bool canAssign=(typeof(long).IsAssignableF
实现oauth2系统,我在使用以下代码时遇到一些问题: import org.springframework.security.oauth2.provider.endpoint.FrameworkEn
我有一些 Java 代码需要使用当前支持泛型的编译器以及(尚)不了解泛型的旧版或外来编译器进行编译。除了极少数使用 Class.isAssignableFrom() 的情况外,我设法使几乎所有代码都可
我使用 isAssignableFrom() 类方法来确定其他应用程序中的类是否实现接口(interface)。因此,我在两个“应用程序”中具有相同的接口(interface),但不在同一个包中。当两
我是一名优秀的程序员,十分优秀!