2010-10-21 23 views
3

J'ai passé une heure à le déboguer, et j'ai finalement éliminé le problème PEBCAK.Méfiez-vous des numéros de version pour charger les assemblages signés

J'ai une application internationalisée. Une partie clé de l'application utilise la réflexion pour charger les types à partir de sources configurées. Ainsi, dans la configuration, il y a une entrée comme ceci:

<component type="Application.Component" assembly="Application, Version=2.0.0.0, Culture=neutral, PublicKeyToken=abcdef"/> 

L'application charge le composant avec ce code:

var assembly = Assembly.Load(assemblyName); 
var rawComponent = assembly.CreateInstance(typeName, false, BindingFlags.CreateInstance, null, instanceParams, CultureInfo.CurrentUICulture, null); 

qui a lamentablement échoué quand j'ai signé le code. Voici la sortie de la visionneuse de journal de 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=abcdef 
(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=abcdef. 
=== 
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=abcdef 
LOG: The same bind was seen before, and was failed with hr = 0x80070002. 
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002). 

Le PEBCAK était que j'ai passé une heure à essayer de comprendre si les ensembles de satellites dans plusieurs cultures ont été le problème. Non, le problème est que, si vous spécifiez 2.0.0.0 comme version (voir l'extrait de configuration ci-dessus), et que votre assembly obtient une version de débogage de 2.0.3946.17829, c'est un numéro de version différent. La solution était de changer la config à ceci:

<component type="Application.Component" assembly="Application, Version=2.0, Culture=neutral, PublicKeyToken=abcdef"/> 

Ma question: Je croyais que vous pouvez spécifier une version à charger, et le CLR chargerait une version supérieure. Pourquoi n'est-ce pas le cas? Qu'est-ce qui me manque?

+0

"le CLR chargerait n'importe quelle version supérieure" - pourquoi? – bzlm

Répondre