ASPX页面编译失败
本文关键字:失败 编译 ASPX | 更新日期: 2023-09-27 17:47:24
我们正在开发一个基于web的应用程序,允许管理员上传插件。所有插件都存储在应用程序根目录外的一个特殊文件夹中(比如C:''Plugins),并通过Assembly动态加载。LoadFrom()。这在大多数情况下都很好:插件中的WebControls被实例化和加载,自定义类按预期运行,等等
我们使用自定义的VirtualPathProvider从这些插件中获取资源。因此,要获得嵌入的ASPX文件,只需执行以下操作:"/MySite/embeddResource/?Assembly=MyPlugin&Resource=MyPage.ASPX"。这也很好:嵌入的ASPX文件像普通页面一样编译和提供。
然而,当嵌入的.aspx文件(在动态加载的插件内部)引用同一插件程序集中的类时,就会出现问题。我们会遇到编译错误,比如"找不到类型或程序集MyPlugin"。这很奇怪,因为很明显,它正在从MyPlugin中提取.aspx文件;那它怎么找不到呢?
所以,我希望你能帮我解决这个问题。插件看起来是这样的:
MyPlugin.dll:
- InternalHelperClass.cs
- MyPage.aspx(不包含.cs文件的资源)
当MyPage.aspx包含类似"<%=InternalHelperClass.WriteHelloWorld()%>"的内容时,编译将失败。
我们如何才能让它发挥作用?
更新:
我们已经尝试使用完全限定的名称。没有区别。这是不可能的——当你转到aspx页面时,这是一个编译错误。在这种情况下,命名空间不会成为问题(因为它来自外部插件dll)
更新2:
乔尔,我想你发现了什么。不幸的是,编辑web.config以包含这些程序集并不是设计的一部分。基本上,我们希望插件是完全动态的——将它们放在文件夹中,重新启动应用程序,然后准备就绪。
程序集。LoadFrom是动态的(后期绑定),这意味着在编译期间不包括该类型,因此对其包含的类的引用无效。您需要专门引用程序集,以便将其作为*.aspx类编译的一部分包含在内。
您可能会发现这里的一些源代码很有帮助,我建议您尝试一下托管扩展性框架,因为它可能已经解决了这个问题。
更新:我找到了我认为是你问题的答案。虽然这在ASP。NET 1.1项目,它将用于2.0+。他们已经重新构建了构建管道,以使用可以在配置文件(web.config)中指定的BuildProvider。虽然你必须编写自己的构建提供程序,但你可以在编译之前制作一个自动引用Plugins文件夹中所有程序集的构建提供器。以下是关于配置的信息,以及您需要子类化的内容
这是Mono的PageBuildProvider的源代码的过期副本,您需要检查ASP的最新实现。NET,复制它,并使用自定义程序集引用对其进行扩展,因为不幸的是,该类是密封的(但看起来并不是很复杂)。
您是否尝试过完全限定helper类的命名空间?它是公开的吗?它在同一个组件中吗?也许它也在另一个必须加载的程序集中。
请尝试进入代码并检查InternalHelperClass的类型。较新的"网站"编译方法通常会添加您意想不到的名称空间。例如,网页的类具有名称空间ASP。我的网页。有时会根据名称空间所在的文件夹添加名称空间。
我从未尝试过这样做,但我怀疑您的ASPX页面虽然是从插件程序集中加载的,但却是在ASP中编译的。NET环境中没有引用您的插件程序集,这将解释为什么完全限定的名称不起作用。
您是否尝试将对MyPlugin.dll的引用添加到web.config文件中的compilation/assemblys标记?