2

カスタム ディレクトリでアセンブリ バインド ログを表示したいので、Fusion Log Viewer のデモを実行しようとしています。

次のように、このための小さなデモアプリケーションを作成しました。

メソッド GetString() を 1 つだけ含み、アセンブリ バージョンを 1.0.0.0 に設定する小さなクラス ライブラリ プロジェクト

namespace ClassLibrary1
{
    public class Class1
    {
        public static string GetString()
        {
            return "yes";
        }
    }
}
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

上記のライブラリを参照し、次のコードを持つ小さなコンソール アプリケーション プロジェクト:

ClassLibrary1.dll バージョン 1.0.0.0

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ClassLibrary1.Class1.GetString());
            Console.ReadLine();
        }
    }
}

このコンソール アプリケーションをビルドし、ビジュアル スタジオを閉じてから、実行可能ファイルを実行します。期待どおり「はい」と出力されます。

次に、ClassLibrary1 の AssemblyInfo を次のようにアップグレードして、バージョン番号を 2.0.0.0 に変更します。

[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]

コンソール アプリケーション内のライブラリをこのバージョン 2.0 に置き換え、実行可能ファイルを再度実行すると、引き続き動作し、「yes」と出力されます。

参照されている DLL が存在しないのに、なぜまだ機能しているのですか? Fusion Log Viewer のカスタム ディレクトリ内に Assembly Bind Log エラーが作成されることが予想されます。

なぜまだ機能しているのか、誰でも説明できますか?

4

1 に答える 1

0

...本質的に同じ質問に対する私の回答をここにコピーします: Assembly Loading Version Mismatch: Why is it loading? ...

私は同じことに直面し、msbuild ログを調べようとしました:

msbuild /v:detailed /t:build

次の行は興味深いものでした。

統一された依存関係 "Newtonsoft.Json、バージョン = 8.0.0.0、カルチャ = ニュートラル、PublicKeyToken = 30ad4fe6b2a6aeed"。AutoUnify が「true」であるため、「C:\src\BindingTest\Lib1\bin\Debug\Lib1.dll」の元のバージョン「7.0.0.0」の代わりにこのバージョンを使用します。

さらに、ビルド後に結果の app.config ファイルをチェックアウトすると、app.config に最初はなかった自動バインド リダイレクトが表示される可能性があります。

したがって、私たちが観察した動作は、"自動アセンブリ統合" および "自動バインディング リダイレクト" msbuild プロセスに関係しています。

パラメータについてドキュメントに記載されている内容は次のとおりです。AutoUnify

true の場合、結果の依存関係グラフは、AppConfigFile パラメーターに渡された App.Config ファイルがあるかのように自動的に処理されます。この仮想 App.Config ファイルには、競合するアセンブリ セットごとに bindingRedirect エントリがあり、最新バージョンのアセンブリが選択されます。この結果、すべての競合が解決されるため、アセンブリの競合に関する警告は表示されません。

true の場合、個別の再マッピングごとに、古いバージョンと新しいバージョンを示し、AutoUnify が true であることを示す優先度の高いコメントが生成されます。

最後に、「失敗」を観察したい場合は、次の引数を使用して msbuild を呼び出すことができます。

msbuild /v:d /t:build /p:AutoUnifyAssemblyReferences=false;AutoGenerateBindingRedirects=false
于 2017-05-12T17:42:49.197 に答える