2008-11-25 60 views
1

我有一個使用Castle Windsor的富客戶端應用程序。目前包括應用程序exe在內的所有程序集都在一個文件夾中,但它看起來相當不整潔。我想把我的dll放在一個子文件夾裏,比如「bin」,但是這可以防止Castle在被調用時定位類型等。事實上,應用程序在啓動時崩潰。溫莎城堡可以找到子目錄中的文件嗎?

有沒有辦法讓Castle看到其他地方的文件?

回答

1

這取決於你如何配置溫莎。

如果使用Castle.MicroKernel.Registration接口,則應手動加載程序集,然後在容器中註冊加載的類型。

1

城堡並沒有進行任何程序集加載,它只是依靠融合來定位基於它的默認探測行爲的程序集 - 所以這更多的是一般的.Net Framework問題。

完成你想要的一種方法是處理程序集解析失敗並將運行時指向程序集所在的位置 - 達到此目的的一種方法是重載程序集解析(有關詳細信息,請參閱msdn),然後編寫一些代碼從正確的位置找到並加載適當的程序集。

這顯然會允許您支持任何種類的目錄方案,而不僅僅是一個二進制子目錄(因此您可以爲插件提供單獨的目錄)。

0

您可以使用自定義的XmlInterpreter來初始化您的容器。 創建一個繼承XmlInterpreter的類,並在該類中放入以下覆蓋: 這個處理當前正在執行的程序集目錄中的所有* .dll.config,它很容易被重寫爲使用某種遞歸文件查找。

public override void ProcessResource(Castle.Core.Resource.IResource source, Castle.MicroKernel.IConfigurationStore store) 
{ 
    base.ProcessResource(source, store); 
    var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
    foreach(var extraConfig in Directory.GetFiles(baseDir, "*.dll.config")) 
    { 
     try 
     { 
      var interpreter = new XmlInterpreter(extraConfig) { Kernel = Kernel }; 
      interpreter.ProcessResource(interpreter.Source, store); 
     }      
     catch(ConfigurationErrorsException) 
     { 
      throw; 
     } 
     catch(Exception ex) 
     { 
      throw new InvalidOperationException("Failed to load configuration: " + extraConfig, ex); 
     } 
    } 
} 
+0

此代碼僅用於配置加載據我可以告訴...它不會加載任何程序集 – 2009-02-16 13:36:59