Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在运行时检查类是否需要引用的dll_C#_.net_Dll_Reflection_.net Assembly - Fatal编程技术网

C# 如何在运行时检查类是否需要引用的dll

C# 如何在运行时检查类是否需要引用的dll,c#,.net,dll,reflection,.net-assembly,C#,.net,Dll,Reflection,.net Assembly,我有一个ea程序,它根据给定目录中找到的所有DLL动态加载和添加元素。 (简而言之:Assembly.LoadFrom(“…xyz.dll”).GetTypes().Where(t=>typeof(MyBaseClass).isAssignableFrom(t).Select(t=>Activator.CreateInstance(t))) 现在,我的一些Dll(包括从MyBaseClass派生的多个类)需要额外的引用Dll,而这些Dll并不总是包含在内(比如使用另一个程序的API Dll时)。

我有一个ea程序,它根据给定目录中找到的所有DLL动态加载和添加元素。 (简而言之:Assembly.LoadFrom(“…xyz.dll”).GetTypes().Where(t=>typeof(MyBaseClass).isAssignableFrom(t).Select(t=>Activator.CreateInstance(t)))

现在,我的一些Dll(包括从MyBaseClass派生的多个类)需要额外的引用Dll,而这些Dll并不总是包含在内(比如使用另一个程序的API Dll时)。这些通常由我的AppDomain.CurrentDomain.AssemblyResolve事件处理,在此事件中,我根据一些安装路径动态加载缺少的API DLL) 因此,当使用assembly.getTypes()时,我会得到一个子类型为“FileNotFoundException”的“ReflectionTypeLoadException ex”,作为ex.LoaderExceptions的一部分。
澄清一下:这个异常是可以的,因为一些API DLL是其他程序的一部分;因此,如果您在未安装这些程序的情况下在另一台PC上运行我的程序,那么引用的API DLL当然会丢失(并且不允许将它们添加到我的程序中)

我现在的问题是:如何筛选列出的类型(从assembly.GetTypes()或ReflectionTypeLoadException ex.types)以删除那些实际使用缺少的API.dll之一的类(或使用使用其中一个的另一个类等)? -assembly.getReferenceAssemblies()仅列出顶级程序集的所有引用程序集。但如前所述,它可以包含基于MyBaseClass的多个类,例如,其中只有一个实际使用缺少的API-DLL(在开始时由“使用…”定义)

作为补充:我可以自动将.CurrentDomain.AssemblyResolve事件拆分到它们的顶级程序集吗?比如在我的每个DLL中都有一个(静态?)解析方法来处理缺少的子程序集,而不是在我的MainForm中为所有程序集提供一个方法

提前谢谢你

致以最良好的祝愿, 罗宾