Я потратил час на его отладку и, наконец, устранил проблему PEBCAK.
У меня есть интернационализированное приложение. Ключевая часть приложения использует отражение для загрузки типов из настроенных источников. Итак, в конфигурации есть такая запись:
<component type="Application.Component" assembly="Application, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789abcdef"/>
Приложение загружает компонент с этим кодом:
var assembly = Assembly.Load(assemblyName);
var rawComponent = assembly.CreateInstance(typeName, false, BindingFlags.CreateInstance, null, instanceParams, CultureInfo.CurrentUICulture, null);
Что с треском провалилось, когда я подписал код. Вот вывод из программы просмотра журнала Fusion:
*** Assembly Binder Log Entry (2010-10-21 @ 11:10:52) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\JetBrains\ReSharper\v5.1\Bin\JetBrains.ReSharper.TaskRunner.CLR4.MSIL.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = DOMAIN\user
LOG: DisplayName = Application.resources, Version=2.0.3946.17829, Culture=es-ES, PublicKeyToken=0123456789abcdef
(Fully-specified)
LOG: Appbase = file:///C:/Source/Application/UnitTests/bin
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = C:\Users\user\AppData\Local\Temp\w3gjhpl2.blr
LOG: AppName = Application.UnitTests
Calling assembly : Application, Version=2.0.3946.17829, Culture=neutral, PublicKeyToken=0123456789abcdef.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Source\Application\UnitTests\bin\Application.UnitTests.dll.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Application.resources, Version=2.0.3946.17829, Culture=es-ES, PublicKeyToken=0123456789abcdef
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
PEBCAK состоял в том, что я потратил час, пытаясь выяснить, были ли проблемы со спутниковыми сборками в разных культурах.
Нет, проблема в том, что если вы указали 2.0.0.0 в качестве версии (см. Фрагмент конфигурации выше), а ваша сборка получила отладочную версию 2.0.3946.17829, это другой номер версии. Решением было изменить конфигурацию так:
<component type="Application.Component" assembly="Application, Version=2.0, Culture=neutral, PublicKeyToken=0123456789abcdef"/>
Итак, мой вопрос: я думал, что вы можете указать версию для загрузки, а CLR загрузит любую более высокую версию. Почему это не так? Что я пропустил?