2011-07-26 138 views
0

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

一切工作正常,除了DLL加载。 我可以加载程序集,但网站无法找到它。如果我把它放在bin文件夹中,一切正常。

加载程序集我使用的是:

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

我如何可以加载该组件,因此它可以在ASCX是在页面上呈现的使用?

同样,我可以将dll放在网站的bin文件夹中,但由于这是动态内容,我宁愿将它们全部保留为孤立的。

+0

每http://stackoverflow.com/questions/6843152:把组件名称类型名称(在@Page继承) – user423430

回答

0

所以你打电话

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; 
} 
+0

这看起来不错,但是我无法将其投入使用。 我应该在哪里处理此事件?我正在尝试Global.asax Applicatimon_Start,但它永远不会被解雇。 我可以在我的VirtualPathProvider中处理这个事件吗? – AlexCode

+0

它应该在应用程序启动时发生(在添加VirtualPathProvider之前)。所以这个事件不会发生?如果你绑定到TypeResolve事件呢?它会被解雇吗? – Jeff

+0

不,没有任何东西会被我的类型调用。我试图捕捉其他相关事件,如您提到的TypeResolve和AssemblyLoad。最后一个被调用,但从来没有为我的类型(这是有道理的,因为我没有加载它)。 – AlexCode