Nó không phải là tầm thường để tạo tệp cấu hình .NET cho tệp .DLL và vì lý do chính đáng. Cơ cấu cấu hình .NET có rất nhiều tính năng được tích hợp sẵn để tạo điều kiện dễ dàng nâng cấp/cập nhật ứng dụng và bảo vệ các ứng dụng đã cài đặt khỏi việc chà đạp các tệp cấu hình khác.
Có sự khác biệt lớn giữa cách sử dụng DLL và cách ứng dụng được sử dụng. Bạn không thể có nhiều bản sao của một ứng dụng được cài đặt trên cùng một máy cho cùng một người dùng. Nhưng bạn rất có thể có 100 ứng dụng hoặc thư viện khác nhau, tất cả đều sử dụng một số .NET DLL.
Trong khi hiếm khi cần theo dõi cài đặt riêng biệt cho các bản sao khác nhau của một ứng dụng trong một hồ sơ người dùng, rất không chắc bạn muốn sử dụng các tập tin DLL khác nhau để chia sẻ cấu hình với nhau. Vì lý do này, khi bạn lấy một đối tượng Cấu hình bằng cách sử dụng phương thức "bình thường", đối tượng bạn lấy lại được gắn với cấu hình của Miền ứng dụng mà bạn đang thực hiện, thay vì cấu hình cụ thể.
Miền ứng dụng bị ràng buộc vào cụm gốc đã tải bản lắp ráp mà mã của bạn thực sự đang in. Trong hầu hết các trường hợp, đây sẽ là bản sao của tệp .EXE chính của bạn, là thứ được tải lên .DLL. Bạn có thể quay lên các miền ứng dụng khác trong một ứng dụng, nhưng bạn phải cung cấp thông tin rõ ràng về những gì mà assembly gốc của miền ứng dụng đó.
Vì tất cả điều này, quy trình tạo tệp cấu hình dành riêng cho thư viện không thuận tiện. Nó là quá trình tương tự bạn sẽ sử dụng để tạo một tệp cấu hình di động tùy ý không gắn với bất kỳ hội đồng cụ thể nào, nhưng bạn muốn sử dụng nó.Lược đồ XML, cấu hình phần cấu hình và cấu phần của phần tử, vv Điều này đòi hỏi phải tạo ra một đối tượng ExeConfigurationFileMap
, tải dữ liệu để xác định nơi tệp cấu hình sẽ được lưu trữ, và sau đó gọi ConfigurationManager
. OpenMappedExeConfiguration
để mở nó thành một phiên bản Configuration
mới. Điều này sẽ cắt bạn khỏi bảo vệ phiên bản được cung cấp bởi cơ chế tạo đường dẫn tự động.
Nói theo thống kê, có thể bạn đang sử dụng thư viện này trong cài đặt trong nhà và bạn không thể sử dụng nhiều ứng dụng trong cùng một máy/người dùng. Nhưng nếu không, có điều bạn nên ghi nhớ. Nếu bạn sử dụng một tệp cấu hình chung duy nhất cho tệp DLL của mình, bất kể ứng dụng đang tham chiếu đến nó, bạn cần phải lo lắng về xung đột truy cập. Nếu hai ứng dụng tham chiếu thư viện của bạn xảy ra cùng một lúc, mỗi đối tượng có đối tượng Configuration
riêng sẽ mở, sau đó khi một lần lưu thay đổi, nó sẽ gây ra ngoại lệ trong lần tiếp theo bạn cố truy xuất hoặc lưu dữ liệu trong ứng dụng khác.
Cách an toàn và đơn giản nhất để thực hiện việc này là yêu cầu lắp ráp DLL của bạn cũng cung cấp một số thông tin về chính nó hoặc phát hiện nó bằng cách kiểm tra Miền ứng dụng của hội đồng tham chiếu. Sử dụng điều này để tạo ra một số loại cấu trúc thư mục để giữ các tệp cấu hình người dùng riêng biệt cho từng ứng dụng tham chiếu đến tệp DLL của bạn.
Nếu bạn là nhất định bạn muốn có cài đặt chung cho tệp DLL của mình bất kể nó được tham chiếu ở đâu, bạn sẽ cần xác định vị trí của mình thay vì .NET. Bạn cũng sẽ cần phải tích cực về việc quản lý quyền truy cập vào tệp. Bạn sẽ cần bộ nhớ cache càng nhiều càng tốt, giữ trường hợp Configuration
xung quanh CHỈ miễn là phải mất để tải hoặc lưu, mở ngay trước và xử lý ngay sau đó. Và cuối cùng, bạn sẽ cần một cơ chế khóa để bảo vệ tệp trong khi nó đang được chỉnh sửa bởi một trong các ứng dụng sử dụng thư viện.
Theo bài viết được giới thiệu: nếu tên của dll là MyDll.dll, thì tệp cấu hình phải là MyDLL.dll.config. Vì vậy, nếu bạn đọc các thiết lập cấu hình từ bên trong dll, nó nên tham khảo cấu hình riêng của nó phải không? – MegaByte
Bất kể mã yêu cầu gì - nó đang tìm kiếm tệp như được chỉ định cho cài đặt AppDomain: AppDomain.CurrentDomain.SetupInformation.ConfigurationFile –
Lưu ý: Câu hỏi "đặt thông tin cấu hình trong DLL" là cách tách cấu hình ứng dụng của bạn mã vào thư viện để tách biệt với mã ứng dụng chính. Điều này rất khác với một tập tin cấu hình riêng biệt và đặc biệt cho một DLL riêng của nó. –