ASPX页面编译失败

时间:2008-10-02 16:53:54

标签: c# asp.net clr

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

我们正在使用自定义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)

UPDATE2:

乔尔,我想你是在做点什么。不幸的是,编辑web.config以包含这些程序集不是设计的一部分。基本上,我们希望插件完全是动态的 - 将它们放在一个文件夹中,重新启动应用程序,然后准备就绪。

3 个答案:

答案 0 :(得分:3)

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

您可能会发现某些源代码here很有帮助,我建议您使用Managed Extensibility Framework,因为它可能已经解决了这个问题。

更新:我发现了我认为你问题的答案。虽然这在ASP.NET 1.1项目中不起作用,但它适用于2.0+。他们重新构建了构建管道以使用可以在配置文件(web.config)中指定的BuildProvider。虽然您必须编写自己的构建提供程序,但可以在编译之前创建一个自动引用Plugins文件夹中所有程序集的程序集。这是information on the configurationhere's what you need to subclass to do it

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

您是否尝试将对MyPlugin.dll的引用添加到web.config文件中的compilation / assemblies标记?