2009-11-05 54 views
6

Tôi đang hợp nhất một vài assembly .NET sử dụng ILMerge bao gồm một số assembly của bên thứ 3. Kể từ khi làm như vậy, tôi đã trải qua một số lỗi mà tất cả đun sôi xuống thực tế là định nghĩa loại được gắn liền với các hội đồng mà họ được xác định trong.Định nghĩa kiểu .NET trong các assembly được hợp nhất (ILMerge)

Một ví dụ đơn giản là định nghĩa cấu hình log4net trong App.config của tôi. Nó sử dụng type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net" sẽ không hoạt động vì assembly log4net không tồn tại khi nó đã được sáp nhập vào assembly đã hợp nhất của tôi. Không phải là một việc lớn mặc dù, tôi thay đổi tên lắp ráp để lắp ráp hợp nhất của tôi và nó hoạt động tốt.

Ví dụ hơi phức tạp hơn là các loại xê-ri nhị phân. Hệ thống của tôi sử dụng serialization nhị phân để gửi các đối tượng nhất định giữa các quá trình. Tất cả các đối tượng serializable được định nghĩa trong một assembly chung mà tất cả các dự án khác tham chiếu. Tôi đã sử dụng serialization mặc định nhị phân, nhưng nó bắt đầu thất bại khi deserializing các đối tượng với lỗi nói rằng nó không thể tìm thấy hội nhập sáp nhập mà serialized đối tượng. Một lần nữa, không phải là một vấn đề lớn, tôi đã thực hiện một SerializationBinder tùy chỉnh tìm kiếm kiểu trong bất kỳ assembly được nạp nào, không chỉ là một assembly đã cho.

Ví dụ trước trở nên phức tạp hơn khi loại được tuần tự hóa tham chiếu các loại có thể tuần tự khác. Tôi đã tiếp tục gặp nhiều vấn đề ngày càng khó khăn hơn để giải quyết.

Điểm tôi đang cố gắng đạt được ở đây là hệ thống kiểu .NET và ILMerge dường như không chơi tốt với nhau. Có ai có bất kỳ kinh nghiệm với cách họ đã giải quyết vấn đề này? Có thể nói với thời gian chạy NET mà tôi không quan tâm những gì lắp ráp loại nói nó nên ở trong, chỉ cần tìm nó ở bất cứ đâu?

LƯU Ý: Vui lòng không trả lời hỏi tại sao tôi hợp nhất các hội đồng, đó không phải là điểm của câu hỏi này.

+0

WAG: Đã thử DataContractSerializer chưa? Bạn sẽ không thể với NetDataContractSerializer vì nó bị ràng buộc với các kiểu, nhưng DCS cũ đơn giản sẽ làm việc cho bạn ... – Will

Trả lời

-2

Chào mừng bạn đến hiểm họa của chuỗi và (vật lý-location) chuỗi trong mã ..

Tất cả các công cụ thuộc loại có vấn đề tương tự và họ tốt hơn là thông minh, như nhiều nhà phát triển và thiết kế các tính năng thời gian chạy như ràng buộc và serialization đã không thực sự dự tính nó, nhưng họ chắc chắn đã đẩy ILMerge như một công cụ 'thông minh'. Nó rất thông minh, nó thậm chí không thể cắt tỉa các loại.

Lưu ý rằng phiên bản cũng có thể phát ở đây và cấu hình,. * Và dấu sao trong mắt và phiên bản độc lập của Redmond cũng không giúp ích gì.

Bạn sẽ tiếp tục gặp sự cố với bit của bên thứ ba. Và hãy tin tôi, tôi biết bạn cần sự hợp nhất, vì số lượng nhỏ các loại có thể mất nhiều thời gian để MS JIT khởi động các ứng dụng lớn (và không, tôi không muốn NGEN hoặc tải xuống 3.5SP1 tối ưu thậm chí còn chậm hơn trước đây do System.Core hoặc blof blof cấm trời).

Tùy chọn tốt nhất, imho, ít nhất là trên quy mô lớn, là có được một công cụ thương mại phong nha quét và xử lý (ví dụ: từ nỗi đau hiện tại và trải nghiệm obfuscation hiện có). Về lâu dài, bạn có thể kết thúc việc thiết lập mã IL hiện tại nếu bạn không có nguồn.

[Sau đó có một chuỗi phát minh INotifyPropertyChanged rằng để giải quyết vấn đề nóng lên toàn cầu - Thiết kế bởi Casio-Calc Inventors]

4

Vâng, có một giải pháp cho vấn đề này: Xây dựng các module thay vì lắp ráp!

Trình biên dịch cho .net có tùy chọn (/ target: module cho C# và VB) để tạo mô-đun thay vì lắp ráp.Nhiều mô-đun sau đó có thể được chuyển đến trình biên dịch và được sử dụng để xây dựng hội đồng cuối cùng.

Tất nhiên, điều này giả định rằng bạn đã có nguồn cho các hội đồng bên thứ ba đó. Nếu bạn không thể có được điều đó, có lẽ một phiên bản .netmodule của hội đồng bên thứ 3 có thể được mua từ bên thứ 3?

Nếu điều đó không hiệu quả, bạn vẫn có tùy chọn cuối cùng. Rõ ràng là bạn đã tháo lắp ráp một bên thứ 3 thành IL. Loại bỏ thông tin lắp ráp từ tệp IL đó và sử dụng "ilasm/dll" để tạo một .netmodule mà bây giờ bạn sẽ có thể sử dụng giống như bất kỳ tệp .netmodule nào khác!

Bằng cách sử dụng các mô-đun thay vì hội đồng, bạn không nên gặp phải bất kỳ sự cố lắp ráp nào khác.

Đúng, chúng tôi đã giải quyết vấn đề của bạn với ILMerge bằng cách không sử dụng ILMerge nữa, nhưng đó không phải là giải pháp tốt nhất?

Hy vọng nó sẽ làm việc cho bạn, đây là một số liên kết có ích:
.netmodule instead of assembly
ILASM with .netmodules

(Và ở đây tôi đã suy nghĩ rằng kinh nghiệm của tôi với .netmodules sẽ không bao giờ có ích cho bất cứ ai!)

0

số nhiều năm sau câu hỏi, tôi đã gặp vấn đề tương tự và tìm ra giải pháp. Bạn có thể thêm [assembly: log4net.Config.XmlConfigurator(ConfigFile = "logging.config", Watch = true)] vào tệp AssemblyInfo.cs và điều này sẽ hoạt động khi hợp nhất gói log4net.

Các vấn đề liên quan