我们正在开发一个基于Web的应用程序,允许管理员上传插件。所有插件都存储在app根目录外的特殊文件夹中(例如,C:\ Plugins),并通过Assembly.LoadFrom()动态加载。这在大多数情况下都可以正常工作:插件中的WebControl实例化和加载,自定义类按预期运行等等。
我们正在使用自定义VirtualPathProvider从这些插件中获取资源。因此,要获得嵌入式ASPX文件,您只需执行“/MySite/embeddedResource/?Assembly=MyPlugin&Resource=MyPage.aspx”。这也很好:嵌入式ASPX文件编译并像普通页面一样提供。
但是,当嵌入的.aspx文件(在动态加载的插件内部)引用同一插件程序集中的类时,问题就出现了。我们得到编译错误,例如“找不到类型或汇编MyPlugin。”这很奇怪,因为很明显,它将.aspx文件从MyPlugin中拉出来;那怎么能找不到呢?
所以,我希望你能帮我解决这个问题。插件看起来像这样:
MyPlugin.dll:
当MyPage.aspx包含类似“<%= InternalHelperClass.WriteHelloWorld()%>”的内容时,编译失败。
我们怎样才能让它发挥作用?
更新
我们尝试使用完全限定名称。没有不同。 无法单步执行 - 当您转到aspx页面时,这是一个编译错误。 在这种情况下,命名空间不会成为问题(因为它来自外部插件dll)
UPDATE2:
乔尔,我想你是在做点什么。不幸的是,编辑web.config以包含这些程序集不是设计的一部分。基本上,我们希望插件完全是动态的 - 将它们放在一个文件夹中,重新启动应用程序,然后准备就绪。答案 0 :(得分:3)
Assembly.LoadFrom是动态的(后期绑定),这意味着在编译期间不包含类型,因此对其包含的类的引用无效。您需要专门引用程序集,以便将其包含在* .aspx类的编译中。
您可能会发现某些源代码here很有帮助,我建议您使用Managed Extensibility Framework,因为它可能已经解决了这个问题。
更新:我发现了我认为你问题的答案。虽然这在ASP.NET 1.1项目中不起作用,但它适用于2.0+。他们重新构建了构建管道以使用可以在配置文件(web.config)中指定的BuildProvider。虽然您必须编写自己的构建提供程序,但可以在编译之前创建一个自动引用Plugins文件夹中所有程序集的程序集。这是information on the configuration和here'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标记?