2

ASP.NET Web 開発サーバーの bin フォルダー外のアセンブリ参照を解決するにはどうすればよいですか? これは、同じ dll のコピーを持たない場合に便利です。

何も機能していません: web.config のプローブ要素が機能しません。アプリケーション マネージャーを実行するため、ドメインをセットアップできません。また、遅すぎるためアセンブリ解決イベントをサブスクライブできません。初期化をサブスクライブできるときは以上。それで、なにかお手伝いできますか?

4

2 に答える 2

8

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 フォルダーまたはプローブ要素が設定されたサブフォルダーにもある必要があります。

同じ場合、このコードに子アセンブリへの参照を追加する必要もあります。

于 2013-05-31T22:47:22.537 に答える
0

「BuildManager.AddReferencedAssembly」を使用する理由

「Application_Start」メソッドでイベントを「AssemblyResolve」にバインドし、aspx ページでアセンブリ名を使用して継承を設定します。「BuildManager.AddReferencedAssembly」はありません。

于 2013-10-08T09:49:18.607 に答える