簡體   English   中英

動態加載頁面類/程序集:在全局名稱空間中找不到類型或名稱

[英]Dynamically Loading Page Class/Assembly: Type or name could not be found in the global namespace

我正在嘗試創建一個ASP.Net Web應用程序,將其“內容”(ASPX / ASCX和程序集)存儲在文件系統之外的其他位置(例如,在服務內部),並根據需要動態加載它們。

我已經成功創建了一個VirtualPathProvider,可以從備用位置讀取ASPX / Master / ASCX文件,但是當這些ASPX頁面繼承一個類時,即在它們后面有代碼時,我遇到了問題。

由於有另一個問題的答案,我現在可以在運行時成功將程序集加載到應用程序中。 但是,當我的運行庫嘗試編譯我的頁面時,出現以下錯誤:

“編譯器錯誤消息:CS0400:在全局名稱空間中找不到類型或名稱空間名稱'Web'(是否缺少程序集引用?)”

[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]公共類default_aspx:global :: Web.Code.CodeBehind,System.Web.SessionState.IRequiresSessionState,System.Web.IHttpHandler

我將代碼簡化為一個簡單的錯誤示例,以便您輕松查看。 您可以在此處下載此代碼

使用AppDomain.AssemblyResolve事件在運行時動態加載程序集。 這在global.asax中,如下所示:

protected void Application_Start(object sender, EventArgs e)
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Assembly_Resolve);
}

Assembly Assembly_Resolve(object sender, ResolveEventArgs args)
{
    Assembly assembly = AppDomain.CurrentDomain.Load(Resources.Web_Code);
    if (args.Name == assembly.FullName)
    {
        return assembly;
    }
    return null;
}

有任何想法嗎?

編輯如果出於任何原因需要更新Web.Code程序集,則需要將其復制到Web項目的“ ReferencedAssemblies”文件夾中,以使這些更改生效。

嘗試從數據庫(和使用AssemblyResolve事件)加載程序集時遇到了相同的問題。 但是,如果您從磁盤加載程序集或至少將.dll文件的副本保存在磁盤上的某個位置,這似乎可以正常工作。

好。 您可以嘗試以下操作-刪除AssemblyResolve事件。 現在,我們將使用web.config運行時配置來解析此程序集。 <runtime>配置中,添加以下內容:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="ReferencedAssemblies" />
</assemblyBinding>

-為什么這兩種方法,我不能對自己解釋AppDomain.AssemblyResolve與此運行AssemblyBinding與交往時給出不同的結果PageBuildProvider 我一直在尋找PageBuildProvider類,以查找有關正在發生的一切線索,但仍然沒有運氣。 我可能會進一步關注它,因為它引起了我的注意,如果我找到任何解決方案,將在此處發布。

讓我知道此帶有web.config文件的解決方案是否適合您。 唯一的警告是您不能使用資源來存儲程序集。 您需要將它們存儲在文件系統中,即項目1下的任何文件夾中-當前與ReferencedAssemblies文件夾相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM