1

我正在尝试创建一个 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”文件夹中以使这些更改生效。

4

2 回答 2

1

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

于 2009-11-02T15:03:10.530 回答
0

好的。您可以尝试以下操作 - 删除 AssemblyResolve 事件。我们现在将使用 web.config 运行时配置来解析这些程序集。在<runtime>配置中添加以下内容:

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

我无法向自己解释为什么这两种方法 -AppDomain.AssemblyResolve这个运行时 AssemblyBinding 在处理PageBuildProvider. 我正在查看 PageBuildProvider 类以找到有关正在发生的事情的任何线索,但仍然没有运气。我可能会进一步研究这个问题,因为它引起了我的注意,如果我找到任何解决方案,我会在这里发布。

让我知道这个带有 web.config 文件的解决方案是否适合您。唯一需要注意的是,您不能使用资源来存储程序集。您需要将它们存储在文件系统上,即项目之一下的任何文件夹 - 目前与 ReferencedAssemblies 文件夹一样。

于 2009-07-31T07:43:54.663 回答