我有一個非常奇怪的問題,我無法將泛型加載到另一個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可以做些什麼來使它的行爲與在測試項目中運行時有所不同?
我認爲拉塞爾是正確的。這可能是一個影子複製問題。嘗試用templateType.Assembly.Location替換AssemblyPath。 –