2010-02-18 7 views
5

Tôi đang sử dụng Visual Studio 2008 SP1 cho C++. Khi biên dịch, Visual Studio cần chọn phiên bản của CRT và MFC DLLs ứng dụng nên được liên kết, phiên bản 9.0.21022.8 (= RTM), 9.0.30729.17 (= SP1) hoặc 9.0.30729.4148 (= SP1 với bản cập nhật bảo mật) . Tôi muốn biết làm thế nào bạn có thể chọn cả hai phiên bản sẽ được liên kết với. Có ai biết không?Làm thế nào để chọn phiên bản của VC 2008 DLLs ứng dụng nên được liên kết đến?

Lưu ý: điều này rất quan trọng khi sử dụng private assembly, vì bạn cần biết phiên bản nào của VC 9.0 DLL để sao chép cùng với .exe.

Lưu ý cờ _BIND_TO_CURRENT_VCLIBS_VERSION chỉ đảm bảo rằng phiên bản phù hợp được bao gồm trong tệp kê khai. Việc lựa chọn phiên bản DLL trong thời gian chạy dường như không được thực hiện dựa trên phiên bản được bao gồm trong tệp kê khai. Ngay cả khi tệp kê khai nói rằng v21022 nên được sử dụng, .exe sử dụng v30729 .DLLs. Tôi biết điều này, bởi vì nó sử dụng std :: tr1 :: weakptr, không có trong v21022.

+1

Chỉ cần lưu ý: Visual Studio 2008 SP1 là 9.0.30729.1 –

+0

@Simon: Bạn nói đúng! Tôi đã cập nhật câu hỏi của mình. –

Trả lời

9

_BIND_TO_CURRENT_VCLIBS_VERSION đặt phiên bản hiện tại trong tệp kê khai - hoặc phiên bản RTM nếu không. Và đặt nó trong tệp kê khai là cách chính xác để thực hiện việc này. Tuy nhiên, những gì bạn thấy là ảnh hưởng của tập tin chính sách lắp ráp: - Khi gói VCRedist chứa thời gian chạy SP1 2008 được cài đặt, nó cài đặt một tệp chính sách vào kho lưu trữ WinSxS với một mục nhập bindingRedirect để chuyển hướng các nỗ lực tải Thời gian chạy RTM với thời gian chạy SP1. Vì vậy, các ứng dụng chỉ định thời gian chạy RTM trong tệp kê khai của chúng sẽ tải thời gian chạy SP1 và các ứng dụng chỉ định thời gian chạy SP1, sẽ tải thời gian chạy SP1. Quay lại đầu trang Cung cấp Phản hồi GIẢI PHÁP Nếu bạn thực sự muốn sử dụng thời gian chạy RTM, ngay cả khi thời gian chạy SP1 và các tệp chính sách được cài đặt, thì bạn cần chỉ định phiên bản RTM trong tệp kê khai của mình và sử dụng tệp cấu hình ứng dụng. Về cơ bản là "yourappname.exe.config" (hoặc "yourdllname.dll.2.config" nếu nó là một cô lập nhận thức dll gây đau buồn). Tệp congifuration ứng dụng có thể cung cấp phần tử bindingRedirect ghi đè bất kỳ phiên bản assembly nào được chỉ định trong tệp kê khai hoặc tệp chính sách.

tập tin cấu hình này sẽ cho hệ điều hành để tải runtime RTM ngay cả khi thời gian chạy SP1 được cài đặt: -

<?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> 

Lưu ý: oldversion được phép có một khoảng: oldVersion="9.0.30729.1-9.1.0.0"

Xem: Application Configuration Files tài liệu trên MSDN.

+0

Cảm ơn bạn rất nhiều vì lời giải thích này. Điều này thực sự giải thích những hành vi kỳ lạ tôi nhận thấy. –

0

Trình biên dịch sử dụng tệp .h và .lib để xác định mã CRT nào sẽ sử dụng. Thay đổi cài đặt xây dựng thư mục tìm kiếm bao gồm và lib cho dự án của bạn để tìm trong các thư mục chứa tệp .lib và .h thích hợp.

Điều đó nói rằng, tại sao bạn cảm thấy cần phải sử dụng bất kỳ điều gì ngoài CRT mới nhất?

3

Bằng việc xác định

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

hoặc

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

bạn có thể liên kết với một phiên bản cụ thể.

+0

Hoặc đơn giản bằng cách xác định _BIND_TO_CURRENT_CRT_VERSION thành 1 (= phiên bản mới nhất) hoặc 0 (= phiên bản cũ nhất). Đúng không? –

+0

Vâng, đó là chính xác. Nhưng nếu bạn muốn ràng buộc một phiên bản được chỉ định, hãy sử dụng định nghĩa từ trên. Tôi đã nhận được trường hợp mà tôi đã phải liên kết với 9.0.30729.1 nhưng _BIND ... đến mới nhất sẽ là 9.0.30729.4148, vì vậy tôi đã phải sử dụng xác định đó. –