asp.net-mvc - 帮助 System.Web.Compilation.BuildManager 在未引用的程序集中查找类型

标签 asp.net-mvc compilation embedded-resource assembly-resolution buildmanager

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

我的问题是 BuildManager 对我的插件文件夹中的程序集一无所知,而且我似乎完全无能为力。如果我这样做:

BuildManager.GetType("PluginAssembly.DefinedType", true, true)

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

var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);

它仍然会抛出错误,即使我现在已经传入了编译 .aspx 文件所需的特定 type。我可以做些什么来帮助 BuildManager 找到编译 .aspx 文件所需的类型?

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

BuildManager.GetType("PluginAssembly.DefinedType, PluginAssembly", true, true)

然而,这仍然失败:

var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);

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

<%@ Page Language="C#"              
         CodeBehind="Index.aspx.cs"
         Inherits="PluginAssembly.DefinedType, PluginAssembly" %>

我收到的错误是:

“编译器错误消息:CS0234:命名空间‘PluginAssembly’中不存在类型或命名空间名称‘DefinedType’(是否缺少程序集引用?)”,源输出如下:

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,它可能会因找不到而引发此异常我的大会。我可以毫无问题地实现这个接口(interface),但是如果我不能告诉 BuildManager 这有什么用呢?

最佳答案

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

  • 调用 BuildManager.AddReferencedAssembly(但我想您已经试过了?)
  • 在编译页面的虚拟目录配置中放入所需程序集的列表(在 system.web/compilation/assemblies 部分)并让这些程序集在应用程序域中可访问(框架似乎使用 Assembly.Load 来查找找到的程序集在配置文件中)。

关于asp.net-mvc - 帮助 System.Web.Compilation.BuildManager 在未引用的程序集中查找类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2652289/

相关文章:

asp.net-mvc - 断言 Action 重定向到正确的 Action /路线?

python - 我可以使用 nuitka 创建单个文件可执行文件吗?

c# - 如何从嵌入式资源中提取文件并将其保存到磁盘?

c# - 添加 "pictures"链接并将其关联到 ID

asp.net-mvc - 从 ADFS 检索用户 ID 声明

go - 使用github的软件包时尝试编译golang时出错

java - 如何在 Eclipse 上导出带有图像的 jar?

c# - c#中全局资源的最佳实践

asp.net-mvc - 无法找到包 ""的版本 ""

ios - Swift:奇怪的 XCode 行为在 NSArray 的子类中具有必需的初始化程序