2010-02-03 3 views
41

Ist es möglich, eine Assembly Binding Redirect zwischen verschiedenen Versionen einer referenzierten Assembly durchzuführen, wenn das öffentliche Schlüsseltoken in der älteren Version null und in der neueren Version festgelegt ist?.Net Assembly Bindung Redirect mit unterschiedlichen öffentlichen Schlüssel Tokens

Zum Beispiel, ich habe zwei Baugruppen ...

System.Web.Mvc, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

und

System.Web. mvc, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35

Sollte die folgende Montage Bindung Redirect Arbeit in der web.config Asp.Net ...

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Antwort

33

Nein, das ist nicht möglich. Die Assemblys müssen denselben öffentlichenKeyToken haben.

Das bindingRedirect -Tag hat nur die oldVersion- und newVersion-Attribute, daher gibt es keine Möglichkeit, es über die "null" -Version zu informieren.

5

Möglicherweise können Sie dazu das Ereignis AppDomain.AssemblyResolve verwenden. Ich habe einen Beispielcode in this answer eingefügt.

+2

Leider scheint es, die öffentlichen Schlüssel-Token müssen noch übereinstimmen. Wenn ich versuche, eine andere Assembly manuell zu laden (mit 'bindingRedirect' oder ohne), bekomme ich" Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. " – ladenedge

+0

@ladenedge, wenn Sie sich den Beispielcode in der Antwort ansehen, mit der ich verlinkt bin, können Sie beliebige Kriterien verwenden, um zu entscheiden, welche Assembly verwendet werden soll. Im Beispiel habe ich den Assemblynamen verwendet und die Token für öffentliche Schlüssel ignoriert. Beachten Sie, dass mein Beispiel eine Assembly dynamisch aus einer Datei geladen hat, nicht zum Zeitpunkt des Starts. Um fair zu sein, ich habe nicht versucht, zu tun, wovon du redest, also ist es vielleicht unmöglich. –

1

Es scheint, dass eine verbindliche-Umleitung kann nicht verwendet werden, aber in meinem Fall habe ich es schaffte mit unterschiedlichen publicKeyTokens, um das Problem zu erhalten, indem den Token-Wert zur Änderung des in der verweisenden DLL angefordert werden:

Zerlegen Sie die DLL in IL, ändern Sie die Referenz, setzen Sie sie neu zusammen (und signieren Sie sie erneut - was ein Problem sein könnte, wenn Sie die Schlüsseldatei nicht haben).

(Siehe meinen Kommentar auf when referencing assemblies, is it possible to insist on a version number but ignore the publickeytoken? (ie accept signed/unsigned))

Verwandte Themen