gpt4 book ai didi

asp.net动态加载程序集

转载 作者:行者123 更新时间:2023-12-02 16:56:21 25 4
gpt4 key购买 nike

我正在尝试使用 MEF 为 asp.net webforms 制作某种插件系统。

到目前为止,我已经提出了一个解决方案,其中主机网站将在其插件文件夹中搜索以加载名为模块的其他网站。模块(插件)只是另一个网站项目,因此它在其 bin 子文件夹中拥有自己的程序集。

您肯定已经知道,ASP.NET 应用程序不会加载其 bin 文件夹之外的 dll。因此,如果我尝试访问模块页面(例如:plugins/MyModule/Page.aspx)。我会收到一条错误消息,指出服务器无法加载程序集 MyModule。我可以将模块的程序集放入主 bin 文件夹中,一切都会正常工作,但我想将所有模块文件保留在同一个文件夹中。

所以我正在寻找一种在 bin 文件夹之外加载程序集的方法。我尝试过修改 web.config 文件,但无法提供有效的解决方案。

然后我遇到了 BuildManager 类并编写了以下代码:

string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
foreach (string f in Directory.GetDirectories(pluginPath))
{
string binPath = Path.Combine(f, "bin");
if (Directory.Exists(binPath))
{
foreach (String file in Directory.GetFiles(binPath, "*.dll"))
{
Assembly a = Assembly.LoadFrom(file);
BuildManager.AddReferencedAssembly(a);
}
}
}

它在 plugin 文件夹中搜索包含 bin 文件夹的任何其他子文件夹,并使用 BuildManager 加载相应的程序集。为了使此代码正常工作,我必须在 global.aspx 程序集的 PreApplicationStartMethod 中调用它。

现在,当我导航到插件页面(plugin/MyModule/Page.aspx)时,它不会再给我之前的错误,但页面是空白的。我检查了源代码,没有 html,什么也没有。我尝试调试页面,但从未调用 Page_Load 方法。所以我猜想 Page.aspx 背后的代码永远不会被调用。

编辑:

因此,经过更多搜索后,我找到了解决方案:

BuildManager Resolving Page Inheritance

当我加载模块程序集时,我将其引用存储在字典中。然后在 AppDomain.CurrentDomain.AssemblyResolve 的事件处理程序中,我返回相应的模块程序集。

最佳答案

我也遇到了同样的问题。我通过如下解决程序集修复了

protected virtual void Application_Start(object sender, EventArgs e)
{

//...

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies();

foreach (var assembly in currentAssemblies)
{
if (assembly.FullName == args.Name || assembly.GetName().Name == args.Name)
{
return assembly;
}
}

return null;
}

关于asp.net动态加载程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19269476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com