如何从 GAC 加载特定版本的程序集
How to load specific version of assembly from GAC
出于测试目的,我喜欢从 GAC 加载特定版本的 DLL 程序集。但是,我的程序总是加载最新版本 - 我认为是由策略程序集驱动的。
var dll = Assembly.Load("Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342");
Console.WriteLine(dll.ToString());
输出:
Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342
即使我以强名称指定版本“4.121.1.0”,它也会加载版本“4.122.1.0”。有没有办法强制使用特定版本?
根据评论中的要求来自 fuslogvw.exe
的结果:
*** Assembly Binder Log Entry (29.06.2017 @ 11:24:15) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Programs\Tools\ConnectionTester_x64.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342
(Fully-specified)
LOG: Appbase = file:///C:/Programs/Tools/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConnectionTester_x64.exe
Calling assembly : ConnectionTester_x64, Version=1.0.353.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Publisher policy file is found at C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Policy.4.121.Oracle.ManagedDataAccess\v4.0_4.122.1.0__89b483f429c47342\Policy.4.121.Oracle.ManagedDataAccess.config.
LOG: Publisher policy file redirect is found: 4.121.1.0 redirected to 4.122.1.0.
LOG: ProcessorArchitecture is locked to MSIL.
LOG: Post-policy reference: Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
LOG: Found assembly by looking in the GAC.
LOG: Binding succeeds. Returns assembly from C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Oracle.ManagedDataAccess\v4.0_4.122.1.0__89b483f429c47342\Oracle.ManagedDataAccess.dll.
LOG: Assembly is loaded in default load context.
看起来符合预期,说
Publisher policy file redirect is found: 4.121.1.0 redirected to 4.122.1.0.
但我喜欢绕过它。
GAC 中安装了版本 4.121.1.0:
C:\Program Files (x86)\Microsoft Visual Studio 11.0>gacutil /l Oracle.ManagedDataAccess
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.18020
Copyright (c) Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Number of items = 3
C:\Program Files (x86)\Microsoft Visual Studio 11.0>
出于测试目的,我喜欢从 GAC 加载特定版本的 DLL 程序集。但是,我的程序总是加载最新版本 - 我认为是由策略程序集驱动的。
var dll = Assembly.Load("Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342");
Console.WriteLine(dll.ToString());
输出:
Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342
即使我以强名称指定版本“4.121.1.0”,它也会加载版本“4.122.1.0”。有没有办法强制使用特定版本?
根据评论中的要求来自 fuslogvw.exe
的结果:
*** Assembly Binder Log Entry (29.06.2017 @ 11:24:15) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Programs\Tools\ConnectionTester_x64.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342
(Fully-specified)
LOG: Appbase = file:///C:/Programs/Tools/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConnectionTester_x64.exe
Calling assembly : ConnectionTester_x64, Version=1.0.353.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Publisher policy file is found at C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Policy.4.121.Oracle.ManagedDataAccess\v4.0_4.122.1.0__89b483f429c47342\Policy.4.121.Oracle.ManagedDataAccess.config.
LOG: Publisher policy file redirect is found: 4.121.1.0 redirected to 4.122.1.0.
LOG: ProcessorArchitecture is locked to MSIL.
LOG: Post-policy reference: Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
LOG: Found assembly by looking in the GAC.
LOG: Binding succeeds. Returns assembly from C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Oracle.ManagedDataAccess\v4.0_4.122.1.0__89b483f429c47342\Oracle.ManagedDataAccess.dll.
LOG: Assembly is loaded in default load context.
看起来符合预期,说
Publisher policy file redirect is found: 4.121.1.0 redirected to 4.122.1.0.
但我喜欢绕过它。
GAC 中安装了版本 4.121.1.0:
C:\Program Files (x86)\Microsoft Visual Studio 11.0>gacutil /l Oracle.ManagedDataAccess
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.18020
Copyright (c) Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL
Number of items = 3
C:\Program Files (x86)\Microsoft Visual Studio 11.0>