2013-07-19 17 views
1

我有以下文件夾結構的應用程序:爲什麼使用Activator.CreateInstance創建的實例不能解析引用?

Application\Modules\XXX 

當然內部XXX任何組件發現XXX內的其他組件。

的問題發生與被實例化用於反射一些實例:

TProvider providerInstance = (TProvider)Activator.CreateInstance(providerType)); 

TProvider有一個返回在另一組件(存儲在XXX以及)定義的類的方法。當調用必須加載引用的providerInstance的方法時,即使依賴項位於同一個XXX文件夾中,我也會收到FileNotFoundException有關未找到相關程序集的信息。

看着融合日誌組裝裝載機只檢查上的應用程序文件夾,而不是XXX?

爲什麼發生這種情況,以及如何解決它的任何想法?

謝謝。

+1

程序集加載和您創建對象實例的方式彼此不相關。 ''應該可以幫到你。 – Dennis

+0

@ Dennis:在調用providerInstance的某些方法時,只會解決一些依賴問題。如果providerInstance的方法將返回在另一個程序集上定義的類,該類將僅在首次調用該方法時才被重新解析。如果我使用ActivatorInstance創建實例,則失敗。如果我通常創建它的工作。 –

+0

@ Dennis:我不需要這樣做,因爲所有的程序集都位於同一個文件夾中。 –

回答

3

的原因是,你加載組件,LoadFile方法:

的LoadFile不會將文件加載到LoadFrom上下文,並不使用負載路徑不 解決依賴關係,因爲LoadFrom方法是否

您應該使用LoadFrom方法和負載從上下文中,或者更好的,如果可能的話,使用Load和負載範圍內。

0

要指示CLR的模塊\ XXX子目錄下探測,使用任何文本編輯器創建一個新的配置文件命名 或applicationname.exe.config使用隨機提供的App.config文件,並將文件保存在文件夾中包含 applicationname.exe應用,在這個例子中是Application。

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Modules\XXX"/> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

說你要指定使用絕對路徑或相對一個組件(不在同一個目錄層次結構的.exe文件),使用<codebase>代替,反正這兩種方法都綁定到XML配置文件的使用。

Assembly.LoadFrom(...)

確實是<codebase>同等學歷;可以採取相對和絕對路徑

主要參考:臨C#5.0和.NET 4.5

2

我加載他們Assembly.LoadFile(文件名)

這是一個很常見的錯誤。它通常是因爲只有LoadFile()有一個體面的MSDN文章不像gobbledegook那樣讀取,加載上下文在.NET中是一個非常抽象的概念。

只有在故意使用LoadFile()時纔會使用不需要需要依賴程序集。這很少見,只有像檢查程序集這樣的程序纔會這樣做。像反彙編的工具。

需要LoadFrom()來讓CLR也在該目錄中查找相關程序集。通常要注意的是,這不是DLLHell的一個有保證的修復,一個類型的身份包含它來自的程序集。在多個程序集中存在具有相同名稱空間名稱和類型名稱的類型時出現問題。一個失敗模式,更有可能在一個單獨的目錄中有一組程序集。特別是當你不控制其內容時,比如插件場景。 Mystifying InvalidCastExceptions可能是您的下一個剋星,也是LoadFile()加載的程序集的常見失敗模式。程序員喜歡將文件組織成目錄,有點OCD,這是一種職業責任,與CLR避免DLL地獄的方式非常不兼容。如果這是插件場景的要求,那麼請確保像MEF這樣老舊的插件框架來限制意外事故。

+0

感謝Hans。我們所有的開發都在XXX文件夾內,因爲我們正在一個擁有PRISM應用程序的大團隊中工作,我們的責任始於XXX文件夾並在XXX文件夾中結束。那麼當你被限制到一個文件夾時,DLL可能不會發生。 –

相關問題