gpt4 book ai didi

c# - Assembly.GetTypes() - ReflectionTypeLoadException

转载 作者:可可西里 更新时间:2023-11-01 07:56:00 25 4
gpt4 key购买 nike

我们为我们的应用程序实现了一个插件框架,并使用 Assembly.Loadfrom 加载插件程序集。然后我们使用 GetTypes() 并进一步检查每个插件文件的类型以获得支持的接口(interface)。

插件的路径由用户提供,我们循环浏览文件夹中的每个文件以查看它(插件)是否支持我们的插件界面。如果是,我们将创建一个实例,如果不是,我们将转到下一个文件。

我们从一个代码库(appA_1 和 appA_2)构建两个版本的软件。

当插件由与插件文件同时构建的应用程序加载时,加载插件效果很好。但是,如果我们构建 appA_2 并指向 appA_1 的插件文件夹,则在调用 GetTypes() 时会出现异常。

我们代码的基本版本是;

var pluginAssembly = Assembly.LoadFrom(FileName);    
foreach (var pluginType in pluginAssembly.GetTypes())
{

我们得到一个“ReflectionTypeLoadException”异常。

这是令人担忧的,因为我们希望我们的应用程序能够加载由任何人构建的任何插件类型。我们缺少什么吗?

编辑:在遍历 LoaderExceptions 之后,我们发现有一个文件 libPublic.dll 会生成 System.IO.FileNotFoundException 异常。奇怪的是,这个文件驻留在应用程序目录中,而插件引用了项目文件。

编辑 2:在异常日志中我们发现如下“比较程序集名称导致不匹配:修订号”

最佳答案

一些事情:

  • 确保您的插件目录中没有重复的程序集(即您已经从您的应用程序目录加载到您的主应用程序中的程序集。)否则,当您加载您的插件时,它可能会加载一个同一程序集的附加副本。这可能会导致有趣的异常,例如:

    Object (of type 'MyObject') is not of type 'MyObject'.

  • 如果您在实例化类型时遇到异常,您可能需要处理 AppDomain.AssemblyResolve:

    private void App_Startup(object sender, StartupEventArgs e)
    {
    // Since we'll be dynamically loading assemblies at runtime,
    // we need to add an appropriate resolution path
    // Otherwise weird things like failing to instantiate TypeConverters will happen
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    }

    private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    var domain = (AppDomain) sender;

    foreach (var assembly in domain.GetAssemblies())
    {
    if (assembly.FullName == args.Name)
    {
    return assembly;
    }
    }

    return null;
    }

我意识到必须告诉 CLR 为了解析程序集,找到具有我们用于解析的名称的程序集有点奇怪,但我已经看到没有它会发生奇怪的事情。例如,我可以从插件程序集中实例化类型,但如果我尝试使用 TypeDescriptor.GetConverter,它不会找到该类的 TypeConverter,即使它可以在类上看到 Converter 属性。


查看您的编辑,这可能不是导致当前异常的原因,尽管您稍后在使用插件时可能会遇到这些问题。

关于c# - Assembly.GetTypes() - ReflectionTypeLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658275/

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