2013-08-06 34 views
1

我爲經常變化的軟件創建了一個插件。我希望我的插件能夠與主軟件的每個新版本一起工作。這就是爲什麼我在通過反射創建插件的主對象之前,短時間加載插件的依賴關係(這是主軟件的可執行文件)。C#反射:等待DLL完全加載,然後創建對象?

但是,這並不總是奏效:我有時間問題。 DLL有時不會被加載(完全),但是執行創建主對象的代碼。這將導致缺少依賴關係的異常。

如何在創建對象之前等待DLL完全加載?

class PluginStarter 
    { 
     private MainPluginObject mainPluginObject = null; 

     public PluginStarter() 
     { 
      AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) => 
      { 
       var fullAssemblyName = new AssemblyName(eventArgs.Name);    

       if (fullAssemblyName.Name.Equals("MainSoftware")) 
       { 
        var found = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, AppDomain.CurrentDomain.FriendlyName)); 
        return found; 
       } 
       else 
       { 
        return null; 
       } 
      }; 

      Initialize(); 
     } 

     private void Initialize() 
     { 
      mainPluginObject = new MainPluginObject(); 
     } 

     public void ShowForm() 
     { 
      mainPluginObject.ShowForm(); 
     } 

     public void Dispose() 
     { 
      mainPluginObject.Dispose(); 
     } 
    } 

只要我在襯裏停用這個Initialize()[MethodImpl(MethodImplOptions.NoInlining)]它只是工作。 正在取消內部正確的解決方案嗎? 如果在Assembly中沒有事件通知您有關DLL加載狀態,還能做些什麼?

+0

您是否驗證過要返回null的程序集? –

+0

@ LasseV.Karlsen:我想把'null'換成其他的東西。 –

+0

嘗試'Assembly.LoadFrom'而不是'Assembly.LoadFile',看看它是否有任何區別。更多關於[this](http://stackoverflow.com/questions/1477843/difference-between-loadfile-and-loadfrom-with-net-assemblies)。 – Noseratio

回答

1

如果你的方法是在成蔭,然後將需要的DLL,因此加載之前你PluginStarter調用構造函數(正在編譯的方法時),特別是,這意味着你的AssemblyResolve事件已被初始化之前。

因此,要麼您需要確保Initialize不是內聯的,否則將您的AssemblyResolve代碼放在靜態構造函數中。

使用靜態構造函數可能會更乾淨,因爲它只會創建一個事件,無論創建多少個PluginStarter對象。