Bạn không chỉ định môi trường của mình là .NET hay Win32 thẳng.
Tôi giả định Win32 của nó bởi vì nếu .NET của nó, các công nghệ để thực hiện điều này gần như tương đương với những thứ như Global Assembly Cache.
Về Win32 có thể tải các file DLL từ một địa điểm được chia sẻ trong một trong hai cách:
Sử dụng LoadLibrary với đường dẫn đầy đủ rõ ràng. Điều này có nghĩa là bạn không thể sử dụng liên kết tĩnh - tất cả các chức năng dll được sử dụng trong tất cả các sản phẩm sẽ phải được truy cập thông qua GetProcAddress. Bạn không thể nhập các lớp C++ từ dll được tải thông qua LoadLibrary - chúng phải được liên kết tĩnh để làm việc để cách tiếp cận này có thể hoặc không thể thực hiện được. Nó không khó khăn để viết các tập tin tiêu đề shim mà giả mạo như giao diện của dll và làm một chỉ trong thời gian tải dll và GetProcAddress khi cần thiết cho mỗi cuộc gọi.
Tùy chọn khác là chuyển dll thành những gì được gọi là "cạnh nhau hội đồng" và cài đặt chúng vào cửa hàng WinSxS. Đừng sợ tên lớn. "bên cạnh lắp ráp" có nghĩa là "Một tập tin dll cộng với tập tin manifest với thông tin phiên bản". Mỗi ứng dụng khác nhau sau đó sẽ đặt 'tên mạnh' - bao gồm thông tin phiên bản - vào tệp kê khai ứng dụng cho mỗi dll nó sử dụng và trình tải xuống Win32 Dll sẽ sử dụng tùy chọn này để chọn đúng dll chung từ cửa hàng WinSxS . Quá trình cơ bản được mô tả trong bài viết MSDN Guidelines for Creating Side-by-side Assemblies
Mở phiên bản Windows 6.1 và lên (Windows Server 2008 và Windows 7 trớ trêu thay tên) file cấu hình ứng dụng làm gì bây giờ hỗ trợ các yếu tố thăm dò trong Application Configuration Files
Điều này có nghĩa là bạn sẽ có thể cung cấp một đường dẫn (liên quan đến ứng dụng của bạn) đến một thư mục chứa các hội đồng dll mà bạn muốn tải.
Ok, Ive thực hiện một số thử nghiệm trên Windows 7, và các công trình này:
Giả sử bạn có một app1.exe ứng dụng được cài đặt trong \ Program Files \ App1, mà phụ thuộc vào một số dll chung "thedll. dll"
Trong thư mục ứng dụng (\ Program Files \ App1) tạo ra một tập tin App1.exe.config và cung cấp cho nó các nội dung sau: -
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="..\AcmeCommon"/>
</assemblyBinding>
</windows>
</configuration>
Bây giờ, tạo một thư mục có tên \ Program F ile \ AcmeCommon, và trong đó một thư mục acme.thedll, và sao chép thedll.dll vào \ Program Files \ AcmeCommon \ acme.thedll
Cũng tạo một tệp trong AcmeCommon \ acme.thedll gọi là acme.thedll.manifest - this sẽ là biểu hiện lắp ráp mô tả việc lắp ráp gọi là 'acme.thedll'
Nội dung acme.thedll.manifest sẽ là: -
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" type="win32"/>
<file name="thedll.dll"/>
</assembly>
Bây giờ chúng ta có dll chung, ở một vị trí thông thường, như một sxs bản địa lắp ráp. Chúng tôi có các ứng dụng, với một tập tin cấu hình mà sẽ, trên Windows 7 và 2008 máy chủ (và lên) nói với nó để tìm kiếm các hội đồng ở vị trí chung. Nhưng ứng dụng vẫn đang cố gắng liên kết với dll dưới dạng dll, thay vì thông qua một hội đồng.
Để tải ứng dụng, chúng tôi cần thêm tệp kê khai vào ứng dụng. Nếu bạn đang sử dụng studio trực quan, các ứng dụng của bạn có thể đã được định cấu hình để tạo và nhúng tệp kê khai thông qua cài đặt dự án công cụ liên kết và tệp kê khai.Trong trường hợp này, cách dễ nhất để nói với các ứng dụng về lắp ráp là để xây dựng lại nó sau khi thêm đoạn mã sau vào ít nhất một tập tin header hoặc c/cpp trong dự án: -
#pragma comment(linker,"/manifestdependency:\"type='win32' name='acme.thedll' version='1.2.3.4' processorArchitecture='x86' language='*'\"")
Nếu bạn đang sử dụng một cũ xây dựng môi trường nơi mà các biểu hiện được làm bằng tay, bạn sẽ cần phải hợp nhất xml sau đây với app1.exe.manifest trong thư mục App1:
<dependency>
<dependentassembly>
<assemblyidentity type="win32" name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" language="*"/>
</dependentassembly>
</dependency>
này nên đóng hình tròn: Khi ứng dụng tải nạp win32 sẽ được tải tệp kê khai ứng dụng (app1.exe.manifest hoặc được nhúng dưới dạng tài nguyên RT_MANIFEST) và tìm hiểu về assembly "acme.thedll". Nó cũng sẽ tải tệp cấu hình ứng dụng (app1.exe.config) và tìm hiểu về đường dẫn riêng để tìm kiếm các hội đồng. Và sau đó nó sẽ tải và thêm "acme.thedll.manifest" vào ngữ cảnh kích hoạt "ứng dụng". Sau đó, khi trình tải cố gắng tải "thedll.dll", nó sẽ tìm kiếm trong bối cảnh kích hoạt db, tìm thấy nó trong assembly acme.thedll và tải nó từ vị trí assembly.
Cảm ơn bạn đã trả lời. Thật không may tôi đang tìm kiếm ứng dụng C/C++ mà không sử dụng bất kỳ phương pháp liên kết động thời gian chạy nào (ví dụ như Loadlibrary (..)). Có anyway để hướng dẫn thông qua biểu hiện như thế nào 'thăm dò' khái niệm hoạt động? – Kartlee
@Kartlee, xin lỗi tôi không biết về C/C++; nhưng tôi đã chỉnh sửa câu hỏi của bạn để phản ánh các từ khóa đó –