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



如何解析ASP的bin文件夹外的程序集引用. NET web开发服务器?这可能是有用的,没有相同的dll的副本。

没有工作:在web上探测元素。配置不工作,我无法设置域,因为它做应用程序管理器,我无法订阅解析程序集事件,因为太晚了-当我可以订阅初始化时已经结束。那我该怎么办呢?

我们可以使用PreApplicationStartMethodAttribute并将它们标记为没有参数的公共静态void方法(在web项目汇编中)。这可以在AssemblyInfo.cs类中完成例如:

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

该方法将在编译之前调用,但在web.config处理之后调用。因此,我们必须显式地告诉编译器在编译期间需要使用哪个程序集。此外,我们需要订阅此处的程序集解析事件,以便我们可以管理程序集解析。下面是示例:

  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. "程序集"仍然必须位于bin文件夹中。其他程序集可以从任何文件夹共享。

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

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

为什么使用'BuildManager.AddReferencedAssembly'?

在'Application_Start'方法中绑定事件'AssemblyResolve'并在aspx页面中设置带有程序集名称的继承,而不是'BuildManager.AddReferencedAssembly'。

相关内容

  • 没有找到相关文章

最新更新