2010-02-18 7 views
5

Używam Visual Studio 2008 SP1 dla C++. Podczas kompilacji Visual Studio musi wybrać, która wersja CRT i MFC DLL powinna być połączona z aplikacją, wersja 9.0.21022.8 (= RTM), 9.0.30729.17 (= SP1) lub 9.0.30729.4148 (= SP1 z aktualizacją zabezpieczeń) . Chciałbym wiedzieć, w jaki sposób można wybrać, z której z obu wersji zostaną połączone. Czy ktoś wie?Jak wybrać wersję biblioteki DLL VC 2008, z którą należy połączyć aplikację?

Uwaga: jest to ważne przy private assembly, bo trzeba wiedzieć, które wersje VC 9.0 DLL skopiować wraz z rozszerzeniem .exe.

Uwaga że tylko flaga _BIND_TO_CURRENT_VCLIBS_VERSION zapewnia, że ​​właściwa wersja jest zawarte w manifeście. Wybór wersji DLL w środowisku wykonawczym najwyraźniej nie jest wykonywany na podstawie wersji zawartej w pliku manifestu. Nawet jeśli plik manifestu mówi, że v21022 powinien być użyty, to .exe używa VLL729 .DLLs. Wiem o tym, ponieważ używa on std :: tr1 :: weakptr, którego nie ma w v21022.

+1

Uwaga: Visual Studio 2008 SP1 to 9.0.30729.1 –

+0

@Simon: Masz rację! Zaktualizowałem moje pytanie. –

Odpowiedz

9

_BIND_TO_CURRENT_VCLIBS_VERSION Ustawia aktualną wersję w manifeście - lub wersję RTM, jeśli nie. Ustawienie w manifeście to właściwy sposób.

To, co widzisz, to jednak efekty pliku zasad zespołu: - Gdy pakiet VCRedist zawierający środowisko wykonawcze SP1 2008 jest zainstalowany, instaluje plik strategii w magazynie WinSxS z wpisem bindingRedirect, który przekierowuje próby załadowania pliku Środowisko wykonawcze RTM do środowiska wykonawczego SP1.

Aplikacje, które określają środowisko wykonawcze RTM w manifeście, ładują środowisko wykonawcze SP1, a aplikacje określające środowisko wykonawcze SP1 ładują środowisko wykonawcze SP1.

Jeśli rzeczywiście chcesz używać środowiska wykonawczego RTM, nawet jeśli zainstalowane są pliki środowiska wykonawczego SP1 i pliki zasad, musisz podać wersję RTM w pliku manifestu i użyć pliku konfiguracyjnego aplikacji. Zasadniczo "yourappname.exe.config" (lub "yourdllname.dll.2.config", jeśli jest to izolacja dll powodująca smutek). Pliki konglomeracji aplikacji mogą zawierać element bindingRedirect, który zastępuje dowolną wersję zespołu określoną w pliku manifestu lub strategii.

Ten plik konfiguracyjny powie OS załadować runtime RTM nawet jeśli jest zainstalowane środowisko wykonawcze SP1: -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<configuration> 
    <windows> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/> 
       <bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </windows> 
</configuration> 

Uwaga: OldVersion może być zakres: oldVersion="9.0.30729.1-9.1.0.0"

Patrz: Application Configuration Files udokumentowane w MSDN.

+0

Dziękuję bardzo za to wyjaśnienie. To naprawdę wyjaśnia dziwne zachowanie, które zauważyłem. –

0

Kompilator używa plików .h i .lib do określenia, który kod CRT ma być używany. Zmień ustawienia kompilacji folderów wyszukiwania i lib dla twojego projektu, tak aby wyglądały w katalogach, w których istnieją odpowiednie pliki .lib i .h.

To powiedziawszy, dlaczego czujesz potrzebę użycia czegokolwiek poza najnowszym CRT?

3

Definiując

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

lub

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

można połączyć przeciwko określonej wersji.

+0

Lub po prostu definiując _BIND_TO_CURRENT_CRT_VERSION na 1 (= najnowsza wersja) lub 0 (= najstarsza wersja). Czy to jest poprawne? –

+0

Tak, zgadza się. Ale jeśli chcesz związać określoną wersję, użyj definicji z góry. Mam przypadek, że musiałem związać z 9.0.30729.1, ale _BIND ... do najnowszego byłby 9.0.30729.4148, więc musiałem użyć tego określenia. –

Powiązane problemy