- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们为我们的应用程序实现了一个插件框架,并使用 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/
我有一个生产用户在尝试从 Outlook 互操作程序集中获取程序集类型时收到 ReflectionTypeLoadException。我需要编写应用程序代码以更好地调试问题,但我无法重现他的问题,因此
当我使用反射时,我遇到了一个带有非抽象方法的抽象类的问题。 下面是我的类(class)示例: abstract class ClassA { public abstract void Meth
我正在为 Windows 10 UWP 使用 EF7。 这让我极度沮丧。我正在从 Visual Studio 2015 中的程序包管理器控制台运行命令 add-migration "test"。我收到
可悲的是,对此异常的引用通常具有异国情调,并且可能发生在您例如通过 Assembly.GetTypes() 枚举类型- 举个例子,它发生在我们的一个部署上,但同一组程序集在集成服务器上运行良好。 为了
我们为我们的应用程序实现了一个插件框架,并使用 Assembly.Loadfrom 加载插件程序集。然后我们使用 GetTypes() 并进一步检查每个插件文件的类型以获得支持的接口(interfac
我试图通过在 C# 中使用 System.Reflection 将所有定义的类型检索到 .NET 程序集中。首先我加载程序集: var assembly = Assembly.LoadFrom("C:
我试图从 .NET 3.5 应用程序检查 silverlight 4 程序集中的类型。我已经用 Assembly.ReflectionOnlyLoadFrom 语句加载了 silverlight 程序
我在 MEF 中使用 DirectoryCatalog 来满足我应用程序中的导入。但是,当我尝试编写目录时,目录中有时会出现混淆程序集,导致 ReflectionTypeLoadException。
我正在尝试使用类似于以下的代码扫描程序集以查找实现特定接口(interface)的类型: public List FindTypesImplementing(string assemblyPath)
我正在尝试 .NET 的新 Spring CodeConfig,但遇到了很多麻烦。 我安装了 NuGet 包 Spring.CodeConfig到现有的 .NET 4 项目中,但除了遇到麻烦外别无其他
在我的项目中,我有以下辅助方法,它遍历所有程序集并获取属于 BaseCamaFrom 类型子类的所有类型。 public static List GetAllTestActionFormTyp
我发现在我的应用程序生成 Telerik 报告后 var result = new ReportProcessor().RenderReport("PDF", new InstanceReportSo
自从将工作的 MonoTouch 3.x 应用程序更新到 MonoTouch 4.0 后,我在尝试在模拟器上启动调试或发布构建时遇到以下错误: Unhandled Exception: System.
我收到类型为“异常详细信息:System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取
我收到此错误:运行时出现编译时错误 我在 unity 论坛上搜索过,他们说这是 System.Web.dll 文件问题,我已经清除了该问题,还重新导入了 Assets ,但它仍然无法正常工作。 Unh
我正在尝试在我的 Silverlight 应用程序中使用类型安全的 WeakReference。我正在按照本网站上的食谱进行操作:http://ondevelopment.blogspot.com/2
我尝试在 .NET 编译器平台(“Roslyn”)示例中创建类似 ConsoleClassifier 的东西。 (Microsoft.CodeAnalysis v0.7...)此时我得到一个Refle
在单元测试期间,我遇到了以下代码的问题,该代码要求所有已加载的程序集: var res = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x
我在 Windows 窗体应用程序中使用 EF4。每当我在没有安装 visual studio 2010 的机器上运行发布文件时,我总是遇到这个错误: System.Reflection.Reflec
我正在使用 Windows 服务,其中我有一个程序集的引用,该程序集是 copy local= false。但是我试图在运行时加载它,虽然当我从 visual studio 运行它时工作正常,但是当我
我是一名优秀的程序员,十分优秀!