2016-07-21 28 views
0

我想爲其他插件B/C可以使用的軟件創建插件A.現在棘手的部分是,我需要它遵循這些規則:使用可能未加載的庫

  • B取決於A,它只會加載如果A存在。
  • C使用A,但它應該在A不存在時起作用。

對於B很容易解決,它只會拋出一個錯誤,因爲A不存在。

現在對於C來說,我該如何做到這一點?我想使用能夠使用A,但如果A不存在,它不應該中斷。

+2

你可以我敢肯定與反思實現這一目標。你能更具體地說明你想如何在'A'中使用類和代碼嗎? – stuartd

回答

1

1例 - 在B的一流水平只是增加依賴於一個失敗B.類裝載

要允許失敗可選 - 包所有來電至A到方法和try/catch周圍調用這些方法所以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 
     } 
} 

如果你需要較大的類/方法號解決方案,您可以改爲考慮反射手動加載,並提供替代實現,如果加載失敗。

+0

這實際上是爲我做的。謝謝! – SHiRKiT

1

如果「library」的意思是「.net程序集」,那麼您可能想嘗試使用AppDomain.GetAssemblies來檢查程序集是否已加載(MSDN)並在此數組中查找您的程序集。

撥叫裝配的一些方法你可能要檢查這個例子 on MSDN

+0

所以你首先檢查你是否有你想要的程序集,然後使用反射從它執行代碼。 –