技术开发 频道

Asp.Net中虚拟文件系统的使用

  三、注册这个虚拟文件提供程序
  这一个很简单,在global.asax中注册:   

protected void Application_Start(object sender, EventArgs e)
        {
            System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
new DllVirtualPathProvider());
        }

  四、调用dll中的用户控件  

Control control1 = this.LoadControl("/MyUserControl/Test.Control.dll/Test.Control.Sample.List.ascx");
                Control control2
= this.LoadControl("/MyUserControl/Test.Control.dll/Test.Control.Sample.Sample.ascx");

                form1.Controls.Add(control1);
                form1.Controls.Add(control2);

  比较简单,就是路径要和前面的一致。

  后记:

  首先感谢 Leepy  同志认真踏实的精神,找出了我这篇文章中的一个BUG。
原来我的第四步:调用dll中的用户控件,是一个web应用程序,如果是一个web站点的话就会出现问题。因为在VS2005中调试时这两种方式呈现出来的Url是不一样的:
  web应用程序:http://localhost:****/Default.aspx
  web站点     :http://localhost:****/WebSite1/Default.aspx
  也就是说我原来的程序没有考虑到非根目录部署的情况,针对这个BUG要修改的地方有(为了BUG的原始记录,我就不在原文中修改了,把修改点列在下面):

  1、GetCacheDependency方法:

GetCacheDependency
    
public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath,
           System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        
if (IsAppResourcePath(virtualPath))
        {
            
string path = HttpRuntime.BinDirectory;

            
return new System.Web.Caching.CacheDependency(path);
        }
        
else
        {
            
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
    }

  这里改成直接改成当前网站的bin目录还可以省掉建空目录的步骤了

  2、在调用的地方修改成以下方式:

  Control control1 = this.LoadControl("~/MyUserControl/MyWebApplication.dll/MyWebApplication.Sample1.ascx");
        Control control2
= this.LoadControl("~/MyUserControl/MyWebApplication.dll/MyWebApplication.Sample2.ascx");

        form1.Controls.Add(control1);
        form1.Controls.Add(control2);
0
相关文章