2012-10-31 59 views
2

我有一個非常奇怪的問題,我無法將泛型加載到另一個AppDomain在ASP.NET內運行時,但它在我的測試項目和一個控制檯應用。無法加載到另一個AppDomain的泛型類型在ASP.NET應用程序

相關的代碼確實基本上是這樣的:

Assembly ass = Assembly.GetExecutingAssembly(); 
string AssemblyPath = ass.Location; 

var templateType = typeof(RazorEngine<RazorTemplateBase>); 

object instance = LocalAppDomain.CreateInstanceFrom(AssemblyPath, 
              templateType.FullName) 
           .Unwrap(); 

在最後一行的代碼炸彈。 AppDomain存在,其基本執行和bin路徑與原始AppDomain相匹配。

在測試項目中運行此代碼時,它工作正常。該實例已創建(作爲TransparentProxy遠程引用參考)並且一切正常。

當ASP.NET運行我上泛型類型參數類型錯誤:

GenericArguments [0], 'Westwind.RazorHosting.RazorTemplateBase',對 「Westwind.RazorHosting.RazorEngine`1 [TBaseTemplateType]'違反了'TBaseTemplateType'類型的 約束。

其中TBaseTemplateType是(即RazorTemplateBase)與RazorEngine通過同一類型這樣定義:

public class RazorEngine<TBaseTemplateType> : MarshalByRefObject 
    where TBaseTemplateType : RazorTemplateBase 

顯然我傳遞正確的類型,因爲它是實際的約束類型,但不知何故AppDomain不認爲通用類型是相同的。

正如我所提到的,它適用於Windows應用程序和測試項目,但在ASP.NET內部,通用類型不會跨AppDomain邊界實例化。使用相同的代碼來創建非泛型類型(甚至是從RazorHosting繼承的此類型的RazorHosting的非泛型版本),並且它工作正常。

難倒。 ASP.NET可以做些什麼來使它的行爲與在測試項目中運行時有所不同?

+0

我認爲拉塞爾是正確的。這可能是一個影子複製問題。嘗試用templateType.Assembly.Location替換AssemblyPath。 –

回答

0

我以前遇到過這個奇怪的問題。它似乎歸結爲Shadow Copy(ASP.NET默認使用),每個AppDomain的ApplicationBase和Load Contexts的組合。

這已經有一段時間,因爲我已經在我的大腦這個問題,但看看我的回答這個問題,看看是否有幫助:

Domain problems

相關問題