代码之家  ›  专栏  ›  技术社区  ›  Gavin Osborn

动态加载页类/程序集:在全局命名空间中找不到类型或名称

  •  1
  • Gavin Osborn  · 技术社区  · 15 年前

    我想创造一个ASP.Net将其“内容”(ASPX/ASCX和程序集)存储在文件系统以外的某个位置(例如,在服务内部)并根据需要动态加载它们的Web应用程序。

    我已经成功地创建了一个VirtualPathProvider,它负责从其他位置读取ASPX/Master/ASCX文件,但是当这些ASPX页继承一个类时,我遇到了一些问题,即:当它们有代码隐藏时。

    感谢你的回答 another question

    “编译器错误消息:CS0400: 无法找到类型或命名空间名称“Web” 缺少程序集引用吗?“

    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] 公共类默认\u aspx :全局::Web.Code.Code隐藏, System.Web.SessionState(系统Web.SessionState).I请求会话状态, 系统.Web.IHttpHandler

    我已经把我的代码归结为一个简单的例子,说明哪里出了问题,这样您就很容易看到了。 You can download this code here .

    正在运行时使用动态加载程序集AppDomain.AssemblyResolve程序集事件。这是在全球.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项目的“ReferencedAssemblies”文件夹中,这些更改才能生效。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sergiu    15 年前

    我在尝试从DB加载程序集(并使用AssemblyResolve事件)时遇到了相同的问题。但是,如果您从磁盘加载程序集,或者至少在磁盘上的某个位置保存一个.dll文件的副本,那么它似乎可以正常工作。

        2
  •  0
  •   Ivan Zlatanov    15 年前

    好 啊。可以尝试以下操作-删除AssemblyResolve事件。我们现在将使用web.config文件解析此程序集的运行时配置。在 <runtime>

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

    我无法解释为什么这两种方法- AppDomain.AssemblyResolve PageBuildProvider . 我在PageBuildProvider类中查找任何关于发生了什么的线索,但仍然没有找到任何线索。我可能会进一步研究这个问题,因为它引起了我的注意,并将张贴在这里,如果我找到任何解决办法。

    如果这个解决方案web.config文件文件对你有用。唯一需要注意的是,您不能使用资源来存储程序集。您需要将它们存储在文件系统中,即项目1下的任何文件夹中—就像当前的ReferencedAssemblies文件夹一样。