2

我们正在开发一个基于 Web 的应用程序,允许管理员上传插件。所有插件都存储在应用根目录之外的特殊文件夹中(例如 C:\Plugins),并通过 Assembly.LoadFrom() 动态加载。这在大多数情况下都可以正常工作:插件中的 WebControls 被实例化和加载,自定义类按预期运行,等等。

我们使用自定义 VirtualPathProvider 从这些插件中获取资源。因此,要获得嵌入式 ASPX 文件,您只需执行“/MySite/embeddedResource/?Assembly=MyPlugin&Resource=MyPage.aspx”。这也很好用:嵌入的 ASPX 文件可以像普通页面一样编译和提供。

但是,当嵌入的 .aspx 文件(在动态加载的插件内部)引用同一插件程序集中的类时,就会出现问题。我们会收到诸如“找不到类型或程序集 MyPlugin”之类的编译错误。这很奇怪,因为很明显,它将 .aspx 文件从 MyPlugin 中拉出。那怎么找不到呢?

所以,我希望你能帮我解决这个问题。该插件看起来像这样:

MyPlugin.dll:

  • InternalHelperClass.cs
  • MyPage.aspx(没有 .cs 文件的资源)

当 MyPage.aspx 包含类似“<%= InternalHelperClass.WriteHelloWorld() %>”的内容时,编译失败。

我们怎样才能让它发挥作用?

更新:

我们已经尝试使用完全限定名称。没有不同。无法单步执行 - 当您转到 aspx 页面时,这是一个编译错误。在这种情况下,命名空间不会成为问题(因为它来自外部插件 dll)

更新2:

乔尔,我认为你在做某事。不幸的是,编辑 web.config 以包含这些程序集并不是设计的一部分。基本上,我们希望插件是完全动态的——将它们放在一个文件夹中,重新启动应用程序,然后就可以使用了。

4

3 回答 3

3

Assembly.LoadFrom 是动态的(后期绑定),这意味着在编译期间不包含该类型,因此对其包含的类的引用无效。您需要专门引用程序集,以便将其包含在 *.aspx 类的编译中。

您可能会发现这里的一些源代码很有帮助,我建议尝试使用托管可扩展性框架,因为它可能已经解决了这个问题。

更新:我找到了我认为是您问题的答案。虽然这不适用于 ASP.NET 1.1 项目,但它适用于 2.0+。他们已经重组了构建管道以使用可以在配置文件 (web.config) 中指定的 BuildProvider。尽管您必须编写自己的构建提供程序,但您可以创建一个在编译之前自动引用 Plugins 文件夹中的所有程序集的提供程序。这是有关配置的信息,这是您需要子类化的内容

这是Mono 的 PageBuildProvider源代码的过时副本,您需要从 MS 的共享源中检查 ASP.NET 的最新实现,复制它,并使用您的自定义程序集引用对其进行扩展,因为该类不幸被密封(但它看起来并不复杂)。

于 2008-10-03T14:09:17.240 回答
0

我从未尝试过这样做,但我怀疑您的 ASPX 页面,虽然它是从您的插件程序集加载的,但正在一个没有引用您的插件程序集的 ASP.NET 环境中编译 - 这可以解释为什么完全限定名称不起作用。

您是否尝试将 MyPlugin.dll 的引用添加到 web.config 文件中的编译/程序集标记?

于 2008-10-02T19:13:04.010 回答
0

您是否尝试过完全限定助手类的命名空间?是公开的吗?它在同一个程序集中吗?也许它在另一个必须加载的程序集中。

尝试进入代码并检查 InternalHelperClass 的类型。较新的“网站”编译方法通常会添加您没有预料到的名称空间。例如,网页的类具有命名空间 ASP.MyWebPage。有时会根据它们所在的文件夹添加命名空间。

于 2008-10-02T17:21:49.347 回答