【问题标题】:ASP.net VirtualPathProvider to dynamically load controlsASP.net VirtualPathProvider 动态加载控件
【发布时间】:2011-07-26 14:37:50
【问题描述】:

我正在使用 VirtualPathProvider 加载编译时不存在的控件 (ascx)。 因此,当请求某个路径结构时,VirtualPathProvider 会重写 ascx 的路径并加载包含该控件代码的 dll。

除了 dll 加载外,一切正常。 我可以加载程序集,但站点找不到它。如果我把它放在 bin 文件夹中,一切正常。

加载我正在使用的程序集:

System.Reflection.Assembly.LoadFrom(file.FullName);

如何加载此程序集,以便在页面上呈现 ascx 时使用它?

同样,我可以将 dll 放在网站的 bin 文件夹中,但由于这是动态内容,我更愿意将其全部隔离。

【问题讨论】:

标签: c# asp.net reflection


【解决方案1】:

所以你在打电话

System.Reflection.Assembly.LoadFrom(file.FullName);

但是这样做不会引发异常,但是在呈现 ascx 文件时仍然找不到您的程序集?您确定您的 ascx 文件引用了完全限定的程序集名称吗?

您可能需要处理 AssemblyResolve 事件:

AppDomain.CurrentDomain.AssemblyResolve += OnCurrentDomainAssemblyResolve

private static Assembly OnCurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name == "myDynamicAssemblyName") return _myPreviouslyLoadedDynamicAssemblyObtainedFromAssemblyLoadFrom;

    return null;
}

【讨论】:

  • 这看起来不错,但我无法使用它。我应该在哪里处理这个事件?我正在尝试 Global.asax Applicatimon_Start 但它永远不会被解雇。我可以在我的 VirtualPathProvider 中处理这个事件吗?
  • 它应该发生在应用程序启动时(在您的 VirtualPathProvider 被添加之前)。所以事件永远不会触发?如果你也绑定到 TypeResolve 事件怎么办?会被解雇吗?
  • 不,我的类型不会调用任何内容。我试图捕捉其他相关事件,例如您提到的 TypeResolve 和 AssemblyLoad。最后一个被调用,但也从不用于我的类型(这是有道理的,因为我还没有加载它)。
  • 只有 VirtualPathProvider 我相信不会有太大用处。我在一个演示 VS2010 项目中这样做,这是我的 Dropbox 上的链接:db.tt/BBAq7IK,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多