Tôi đang làm việc trên một ứng dụng Windows (EXE) sử dụng nhiều DLL. Phát triển là trong VCExpress 2005 (VC 8.0), chỉ sử dụng C.LoadLibrary() không tải được DLL với tệp kê khai và riêng tư
Một số các tệp DLL này là các trình cắm thêm/tiện ích/tiện ích được tải động bằng cách sử dụng LoadLibrary
theo tệp cấu hình được đọc bởi EXE.
Quan trọng: ứng dụng phải di động (theo nghĩa có thể chạy từ ổ flash USB hoặc tương tự mà không cần cài đặt) và DLL trình cắm thêm có thể không nằm trong cùng thư mục với ứng dụng EXE (lý do cũ)).
Với MSVC6 điều này đơn giản: biên dịch, liên kết, phân phối EXE và DLL.
Với MSVC8 Thư viện thời gian chạy C (MSVCRT) không còn được phân phối với hệ điều hành, do đó, người ta không thể dựa vào nó đang được cài đặt. Để đáp ứng yêu cầu về tính di động, tôi cần sử dụng private assembly. Tất cả các EXE và DLL đã có các biểu hiện của chúng được nhúng vào.
Vấn đề của tôi: các DLL plug-in nạp qua LoadLibrary()
không tìm ra private assembly đó là trong thư mục của EXE, vì vậy cố gắng để tải chúng thất bại trừ khi lắp ráp Microsoft.VC80.CRT
được cài đặt trong winsxs.
Sản phẩm bắt giữ: nếu tệp kê khai bị xóa khỏi plugin trình cắm thêm DLL, mọi thứ đều hoạt động.
Câu hỏi của tôi:
Trong trường hợp vấn đề, Windows dường như không thể sau một trong hai Assembly searching sequence hoặc Dynamic link library search order. Cụ thể là nó đang tìm kiếm assembly riêng trong đường dẫn mà từ đó DLL đã được nạp, không phải từ đó ứng dụng (EXE) được nạp.
Tôi đã cố gắng xác minh điều này bằng cách đặt lắp ráp liền kề với tệp DLL và thay đổi thư mục hiện tại (để loại trừ các trường hợp thư mục hoạt động) và nhận được hành vi mong muốn. Bất cứ ai khác có thể xác nhận rằng đây là hành vi bình thường khi sử dụngLoadLibrary
với SxS?Tôi có giả định rằng nếu không có tệp kê khai, DLL rơi trở lại thứ tự tải không SxS đang tìm kiếm
msvcr80.dll
(chứ không phải tệp kê khaiMicrosoft.VC80.CRT.manifest
) trong thư mục EXE?Nếu tôi đúng về (1) và (2), tôi sẽ mất gì khi chỉ loại trừ tệp kê khai khỏi tệp DLL? Rephrased, tại sao tôi không nên giải quyết vấn đề của tôi bằng cách chỉ loại trừ các biểu hiện?
Cảm ơn - Tôi thấy rằng http://stackoverflow.com/questions/238465 và http://stackoverflow.com/questions/787216 cũng thảo luận về giá trị tương đối của liên kết tĩnh và động. Tôi do dự khi sử dụng liên kết tĩnh vì tôi không chắc chắn rằng API không cho phép/mong đợi phân bổ tài nguyên và phân phối xảy ra trong các mô-đun khác nhau, điều này sẽ làm hỏng ứng dụng. Ngoài ra liên kết tĩnh sẽ dẫn đến các tập tin nhị phân cồng kềnh. – Twylite