Khi di chuyển sang .net 4, chúng tôi bắt đầu gặp sự cố với thư viện của chúng tôi. Giả sử chúng ta có thư viện MyLib.dll và nó tham khảo interop assembly Interop.dll. Interop.dll có tham chiếu đến MissingInterop.dll..NET 4 tải các cụm khác nhau từ .NET 3.5
Vì vậy, các tài liệu tham khảo có thể được hiển thị như: MyLib.dll -> Interop.dll -> MissingInterop.dll
Trong MyLib.dll chúng tôi sử dụng chỉ là một phần của các lớp học từ Interop.dll vì vậy chúng tôi không bao giờ gọi bất cứ điều gì mà cần MissingInterop.dll và trong .net 3.5 nó hoạt động tốt Đó là lý do tại sao chúng tôi không gửi MissingInterop.dll với MyLib.dll.
Khi chúng tôi sử dụng MyLib.dll từ quá trình chạy dưới .net 4 ứng dụng không thành công với những ngoại lệ sau đây:
FileNotFoundException: "Could not load file hoặc lắp ráp 'MissingInterop.dll, Version = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null 'hoặc một trong những phụ thuộc của nó. Hệ thống không thể tìm thấy tệp được chỉ định. "`
Tôi cũng nhận thấy rằng tham chiếu Interop.dll thiếu tập tin khác nhưng .net không cố gắng tải chúng. Và tôi đã tìm thấy sự khác biệt. Một số loại từ MissingInterop.dll được sử dụng trong các thông số phương pháp trong Interop.dll trong khi các loại từ các thư viện thiếu khác chỉ được sử dụng như các loại phương thức hoàn trả, tức là trong Interop.dll tôi có thể thấy:
Class C1
MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&)
Class C2
get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()
và .NET 4 cố gắng để tải MissingInterop.dll nhưng không cố gắng để tải AnotherMissingInterop.dll.
.NET 3.5 không cố gắng tải cả MissingInterop.dll lẫn AnotherMissingInterop vì chúng không được sử dụng trong đường dẫn thực thi.
Tôi biết rằng .NET 4 có Fusion mới nhưng tôi không tìm thấy thay đổi đột phá như được mô tả ở bất kỳ đâu. Không ai biết tại sao .NET 4 cố tải thứ gì đó không cần thiết? Có cách nào để sửa lỗi này mà không biên dịch lại mã hoặc thêm tệp bị thiếu không?
Có, thay đổi lớn trong .NET 4 để kích hoạt tính năng "nhúng loại interop". Bạn đã phá vỡ bảo hành trước đó, nó làm việc một cách tình cờ. Sử dụng [ComImport] để cung cấp các loại bị thiếu. –
Có thể vì một trong các tham chiếu được xây dựng dựa trên khung 3.5. Bạn nên cố gắng thêm useLegacyV2RuntimeActivationPolicy = "true" như được mô tả ở đây: http://stackoverflow.com/questions/1604663/what-does-uselegacyv2runtimeactivationpolicy-do-in-the-net-4-config –
Benoit, cảm ơn bạn đã đề xuất nhưng nó không giúp được gì. –