首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助System.Web.Compilation.BuildManager在非引用程序集中查找类型。

帮助System.Web.Compilation.BuildManager在非引用程序集中查找类型。
EN

Stack Overflow用户
提问于 2010-04-16 10:51:22
回答 4查看 2.9K关注 0票数 3

我正在尝试编写一个插件系统,其中程序集可以放在ASP.NET不知道的文件夹中。此插件系统适用于基于ASP.NET MVC的程序集,但对于传统的WebForm程序集( .aspx文件Inherits System.Web.UI.Page派生类),System.Web.Compilation.BuildManager负责将.aspx文件编译成动态程序集。

我的问题是,BuildManager对我的插件文件夹中的程序集一无所知,而且我完全无法帮助它。如果我这样做了:

代码语言:javascript
复制
BuildManager.GetType("PluginAssembly.DefinedType", true, true)

它扔了。如果我首先获得对Type的引用,然后尝试:

代码语言:javascript
复制
var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);

它仍然抛出,尽管我现在已经传入了特定的type,它需要编译.aspx文件。有什么可以帮助BuildManager找到编译.aspx文件所需的类型吗?

更新:--我进一步了解了BuildManager.GetType()的实际功能。通过指定在其中定义类型的程序集(如"PluginAssembly.DefinedType,PluginAssembly"),然后将自己连接到System.AppDomain.CurrentDomain.AssemblyResolve事件,我现在可以找到插件程序集并返回它,以便BuildManager能够成功地构造该类型。这使得下面的工作非常出色:

代码语言:javascript
复制
BuildManager.GetType("PluginAssembly.DefinedType, PluginAssembly", true, true)

然而,这仍然失败了:

代码语言:javascript
复制
var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);

尽管.aspx文件现在在其Inherits指令中具有相同的程序集引用:

代码语言:javascript
复制
<%@ Page Language="C#"              
         CodeBehind="Index.aspx.cs"
         Inherits="PluginAssembly.DefinedType, PluginAssembly" %>

我收到的错误是:

编译器错误消息: CS0234:名称空间'DefinedType‘中不存在类型或名称空间名称’DefinedType‘(您缺少程序集引用吗?)具有以下源输出:

代码语言:javascript
复制
Line 205:
Line 206:    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
Line 207:    public class plugins_pluginassembly_dll_index_aspx
                 : global::PluginAssembly.DefinedType,
                   System.Web.SessionState.IRequiresSessionState, 
                   System.Web.IHttpHandler {
Line 208:        
Line 209:        private static bool @__initialized;

BuildManager.CreateInstanceFromVirtualPath()内部发生的事情似乎涉及到一个特定的System.Web.Util.IWebObjectFactory,它可能负责通过找不到我的程序集抛出这个异常。我可以在没有任何问题的情况下实现这个接口,但是如果我不能告诉BuildManager这个接口有什么帮助呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-26 17:08:28

最后,我用Web部署项目 [1]解决了这个问题,方法是将整个web应用程序预编译成两个独立的程序集,然后使用Assembly.GetTypes()深入到正确的程序集中,为给定的Page请求实例化正确的Page

它让插件开发人员承担更多的责任,但是在(安全敏感和脆弱的) web上下文中执行所有插件之前,让ASP.NET编译器对所有插件进行完全验证,从而获得更好的性能。

票数 0
EN

Stack Overflow用户

发布于 2010-04-23 13:25:25

我看到了两种可以指定用于编译页面的程序集的方法:

  • 打电话给BuildManager.AddReferencedAssembly (但我想你已经试过了吗?)
  • 在编译页面的虚拟目录配置中提供所需程序集的列表(在system.web/编译/程序集部分),并在app域中访问这些程序集(框架似乎使用Assembly.Load查找配置文件中的程序集)。
票数 1
EN

Stack Overflow用户

发布于 2010-04-26 05:17:40

我不知道BuildManager是如何加载类型的,但是您可以尝试使用AssemblyResolve --订阅AppDomain.CurrentDomain.AssemblyResolve事件,自己加载程序集并返回(是的,返回) Assembly实例(如果不识别的话返回null )。

并非所有这样的代码都使用与此兼容的方法,但值得一试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2652289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档