2012-05-22 23 views
8

KontekstDlaczego moja aplikacja zawsze korzysta z najnowszej wersji GAC zamiast wersji referencyjnej?

Mam 2 różne wersje zestawu zainstalowanego w GAC, wersji 1.0 i wersji 2.0. Zrobiłem aplikację, która odwołuje się do wersji 1.0 jako konkretnej wersji.

Issue

Kiedy uruchomić mój wniosek, to zawsze będzie ładować w wersji 2.0, podczas gdy aplikacja jest specjalnie przedstawieniu wersji 1.0.

Pytanie

Dlaczego tak się dzieje? Jak mogę wymusić na mojej aplikacji załadowanie wersji, dla której została skompilowana?

Nie wydaje mi się, że ma to coś wspólnego z wiążącym przekierowaniem, ponieważ moja aplikacja nie była nawet świadoma wersji 2.0, kiedy ją zbudowałem i że referencyjne metadane "Konkretnej wersji" są ustawione na true.

Dzięki.


Edit:

Zespół ja przedstawieniu jest rzeczywiście Oracle.DataAccess z pakietu ODAC. Zauważyłem, że inne zespoły o nazwie Policy.x.xxx.Oracle.DataAccess zostały opublikowane w GAC.


Edit 2:

Po patrząc na politykę Oracle.DataAccess znalazłem konfigurację określającą wiązania przekierowanie:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/> 
      <bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Chociaż dodał odwrócić wiążące przekierować do mojego konfiguracja aplikacji, polityka w GAC wydaje się mieć priorytet. znalazłem MSDN article potraktowanie tematu i sugeruje, aby ignorować politykę w tej konfiguracji:

<publisherPolicy apply="no" /> 

Ale to nadal nie działa ...


Edycja 3:

I próbował usunąć politykę z GAC i ponownie uruchomić mój komputer. W końcu zadziałało. Nie ma wrażenia, że ​​jest to wygodne rozwiązanie, ale ta polityka złamała jedną z moich aplikacji, co oznacza, że ​​wyłączenie polityki jest właściwe w moim przypadku.


Finał Edit:

Igor dał mi właściwą odpowiedź.Wszystko co musiałem zrobić, aby obejść te zasady było użyć ustawienia publisherPolicy w prawej części configruation:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/> 
     <publisherPolicy apply="no"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 
+0

Czy sprawdzić, że nie było żadnego polityka wydawcy za odwołanie montażu ? –

+0

@IgorKorkhov: Tak, znalazłem coś w nazwie Policy.x.xxx.MyAssemblyName w GAC. Nie wiedziałem o takim mechanizmie. Edytuję moje pytanie i możesz przesłać odpowiedź. Dzięki. – Ucodia

+0

Pytanie styczne: Jaki problem powoduje, że chcesz używać V1? Używam Oracle od czasu do czasu, więc uprzedzony jest przedramion :) – Ian

Odpowiedz

7

Po edytowane pytanie staje się jasne, że jest to plik, który ma wpływ polityka montaż wiązania.

W przypadku Oracle znajduje się plik o nazwie Policy.XYOracle.DataAccess.config z treścią podobny do tego:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/> 
      <bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Polityka jest zainstalowany przez instalatora Oracle i przekierowuje Oracle.DataAccess.dll do najnowszej wersji, według Oracle biblioteka jest wstecznie kompatybilna.

EDIT: Jeśli nie chcesz polityka wydawca być stosowane dla konkretnego zespołu, umieścić element w elemencie:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="myAssembly" publicKeyToken="..." culture="en-us" /> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
      <publisherPolicy apply="no" /> 
    </dependentAssembly> 
</assemblyBinding> 
+0

Próbowałem z '', ale to nie rozwiązało problemu. Przeczytałem [tutaj] (http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx), że mogę użyć '' do zignorowania zasad, ale wciąż ten sam problem. .. – Ucodia

+0

@Uododia: to dziwne. Czy odwołujesz się do wersji v4.112.3.0 w swojej aplikacji? Może powinieneś spróbować włączyć szereg wersji (powiedzmy '0.0.0.0-4.65535.65535.65535'), aby sprawdzić, czy to zadziała? –

+0

Mam konkretnie odniesienie 4.112.2.1. Zaktualizowałem moje pytanie z kilkoma nowymi ustaleniami. Wygląda na to, że zasady opublikowane w GAC zastępują dowolną konfigurację aplikacji. – Ucodia