3

log4net の強力な名前付けとバージョン管理、つまり古い 1.2.10 名、新しい 1.2.11 名、および (天の助けを借りて) SAP が作成し、独自の強力な名前で GAC に押し込んだ 1.2.10 に関する深刻な頭痛の種のため私のアプリケーションは、自分のマシン以外での実行を拒否します。存在しない厳密な名前の SAP バージョンのバージョン 1.2.11 を探し続けます。

私のプロジェクトには厳密な名前が付けられていないため、コンパイラが厳密な名前のアセンブリを検索するのを停止し、ディレクトリに配置したアセンブリをロードするだけです。マニフェストが一致しないと不平を言っているので、プロジェクトでそのバージョンと公開鍵の参照を見つけようとしていますが、不足しています。このマニフェストはコンパイル時に作成されるようです。

どうすればそれをオーバーライドできますか? 参照するアセンブリを正確に指定するために使用できるプロパティ、スイッチ、または条件付きコンパイルはありますか?

最終的には、log4net の 1.2.11 バージョンを使用し、アセンブリに GAC のバージョンを無視させて、ローカルの bin ディレクトリのみを調べたいと考えています。本当はこんなに苦しくないはずです。

4

2 に答える 2

2

ランタイムディレクティブ

実行時に、どの特定のバージョンが存在するかを気にせず、フォルダーにあるものをロードしたいだけの場合に、アセンブリのバージョン管理AppDomain.AssemblyResolveの問題に対処するために使用できます。このコードは、ここからインスピレーションを得て作成されました。/bin

string[] ignoreAssembyVersions = new string[] { "log4net" };
AppDomain.CurrentDomain.AssemblyResolve += (_, assembly) =>
{
    //ignore the vesion number and return any version that has been loaded
    var name = new AssemblyName(assembly.Name);
    var shortName = name.Name; // retrieve short name
    if (ignoreAssembyVersions.Contains(shortName)) // compare against list of assemblies we ignore revisions for
    {
        // check if this assembly is already loaded under a different version #
        Assembly[] allAss = AppDomain.CurrentDomain.GetAssemblies();
        List<Assembly> list = new List<Assembly>(allAss);
        var loadedAssembly = list.Find(ass => new AssemblyName(ass.FullName).Name == shortName); // check if we have any version loaded yet
        if (loadedAssembly != null)
            return loadedAssembly;
        else // assembly has not yet been loaded in this domain
        {   // probe for assembly by name
            Assembly probedAssembly = Assembly.LoadFrom(string.Format("{0}.dll", shortName)); // probe for any match on assembly.dll 
            return probedAssembly;
        }
    }
    return null; // ignore binding failure -> pass up the stack
};

AssemblyResolveイベントを処理する代わりに、カスタムbindingRedirectポリシーを使用することもできます。/binただし、これは、App Domainに存在するバージョン、またはAppDomainに現在ロードされているバージョンがわかっている場合にのみ機能します。

ビルド時ディレクティブ

ビルド時に使用するアセンブリバージョンを制御する場合は、Specific Version='true'追加するアセンブリ参照にforを使用できます。

于 2012-08-23T14:34:46.287 に答える
0

あなたの問題を理解できたと思います。各アセンブリのカスタム バインディング ポリシーとアセンブリの場所をサポートするために、dependentAssembly構成を使用することを検討してください。これは、アセンブリの別のバージョンを検索するための構成ポリシーのスナップショットです。System.Data.SQLite

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.81.0" newVersion="1.0.81.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
于 2012-08-23T13:56:14.190 に答える