gpt4 book ai didi

asp.net - 在 bin 文件夹外的 ASP.NET 项目中解析程序集

转载 作者:行者123 更新时间:2023-12-02 07:35:43 25 4
gpt4 key购买 nike

如何在 ASP.NET Web 开发服务器的 bin 文件夹外解析程序集引用?这对于没有相同 dll 的副本很有用。

没有任何效果: probing element at web.config不起作用,我无法设置域,因为它是应用程序管理器,而且我无法订阅 resolve assembly event 因为为时已晚 - 当我可以订阅初始化结束时。那我该怎么办?

最佳答案

我们可以使用PreApplicationStartMethodAttribute并将它们标记为一些不带参数的 public static void 方法(在 web 项目程序集中)。这可以在 AssemblyInfo.cs 类中完成例如:

[assembly: PreApplicationStartMethod(
typeof(Web.Initializer), "Initialize")]

该方法将在编译之前但在处理 web.config 之后调用。所以我们必须明确地告诉编译器它在编译期间需要使用的程序集。我们还需要在此处订阅 Assembly Resolve 事件,以便我们可以管理程序集解析。这是示例:

  public static class Initializer
{
public static void Initialize()
{
AppDomain.CurrentDomain.AssemblyResolve += LoadFromCommonBinFolder;
var referAsm = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var assemblyName in referAsm)
{
try
{
var curAsm = Assembly.Load(assemblyName);
BuildManager.AddReferencedAssembly(curAsm);
LoadChildReferences(curAsm);
}
catch {}
}
}

private static void LoadChildReferences(Assembly curAsm)
{
foreach (var assemblyName in curAsm.GetReferencedAssemblies())
{
try
{
BuildManager.AddReferencedAssembly(Assembly.Load(assemblyName));
}
catch {}
}
}

private static Assembly LoadFromCommonBinFolder(object sender, ResolveEventArgs args)
{
string commonBinFolder = System.Configuration.ConfigurationManager.AppSettings["CommonBinFolderPath"];

if (String.IsNullOrEmpty(commonBinFolder))
{
throw new InvalidOperationException("​​CommonBinFolderPath in the app.config isn't seted.");
}

string assemblyName = new AssemblyName(args.Name).Name;
string assemblyPath = Path.Combine(commonBinFolder, assemblyName);

if (!File.Exists(assemblyPath + ".dll"))
{
if (!File.Exists(assemblyPath + ".exe"))
{
//searching for resources
var ci = CultureInfo.CurrentUICulture;
assemblyPath = Path.Combine(commonBinFolder, ci.Name, assemblyName + ".dll");
if (!File.Exists(assemblyPath))
{
assemblyPath = Path.Combine(commonBinFolder, ci.Parent, assemblyName + ".dll");
if (!File.Exists(assemblyPath))
{
return null;
}
}
}
}

return Assembly.LoadFrom(assemblyPath);
}
}

在这种情况下,“Web.Project.Assembly”仍然必须位于 bin 文件夹中。其他程序集可以从任何文件夹共享。

包含在 web.config 文件中的编译元素下的程序集必须也在 bin 文件夹中或子文件夹中并设置了探测元素。

在相同的情况下,我们还必须在此代码中添加对子程序集的引用。

关于asp.net - 在 bin 文件夹外的 ASP.NET 项目中解析程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16867087/

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