使用可能未加载的库

时间:2016-07-21 21:58:10

标签: c# plugins

我想为其他插件B / C可以使用它的软件创建一个插件A.现在棘手的部分是我需要它遵循这些规则:

  • B取决于A,只有在A存在时才会加载。
  • C使用A,但如果A不存在则应该起作用。

对于B来说,它很容易解决,因为A不存在就会抛出错误。

现在对于C,我该如何实现这一目标?我想使用能够使用A,但如果A不存在则不应该中断。

2 个答案:

答案 0 :(得分:1)

对于1种情况 - 只是在B级的类级别向A添加依赖性将无法加载B类。

允许可选的失败 - 将对A的所有调用包装到方法中并尝试/捕获对这些方法的调用,以便捕获JIT失败:

 class C
 {
   // no references to A at class level

   int MethodUsingA()
   {
      // use A here
   }

   int MethodTryingToUseA()
   {
      try 
      {
        return MethodUingA(); // will throw loader error 
                              // during JIT if A assembly is missing 
      }
      catch // use specific exception, LoaderException?
      {
        return 42; // JIT of MethodUingA failed
      }
 }

如果您需要大量类/方法的解决方案,您可以考虑反射以手动加载,并在加载失败时提供替代实现。

答案 1 :(得分:1)

如果“库”是指“.net assembly”,那么您可能想尝试使用AppDomain.GetAssemblies来检查程序集是否已加载(MSDN)并在此数组中查找程序集。 / p>

要从程序集中调用某些方法,您可能需要检查此示例 on MSDN