16

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?

+7

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. –

+0

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 –

+0

Benoit, cảm ơn bạn đã đề xuất nhưng nó không giúp được gì. –

Trả lời

0

Khi bạn di chuyển ứng dụng của mình từ .NET 3.0, 3.5 đến 4.0, thì bạn cần bao gồm mylib.dll vào dự án của bạn bên ngoài và biên dịch chúng hoặc nếu có thể bạn có mã nguồn của assembly sau đó thay đổi nó thành .net 4.0

+0

Chúng tôi đã làm điều đó. Nhưng câu hỏi là tại sao clr 2.0 là ok với tình huống này và clr 4.0 thì không. –

1

Có lẽ không phải (từ kinh nghiệm). Có những vấn đề tương tự xung quanh một bước trước đó (không thể nhớ nếu nó là 2.0 -> 2.1 hoặc 3.0 -> 3.1. Nhưng nó đã được một thời gian trước) Chúng tôi đã có máy báo cáo rằng phiên bản trước đó đã được cài đặt, và bị rơi. Khi chúng tôi làm sạch các cài đặt thực và cài đặt phiên bản thấp hơn, sau đó cập nhật, tất cả đều hoạt động tốt. Microsoft có thể lẻn ra một miếng vá. Tôi muốn có khuynh hướng nâng cao nó với MS. Bạn có một lỗi dường như được nghiên cứu kỹ lưỡng, và trong các hợp đồng hỗ trợ chu vi như vậy hay không, họ rất miễn cưỡng để kết thúc việc tính phí bạn. (Kinh nghiệm của tôi anyway)

+0

cảm ơn, có lẽ chúng tôi sẽ làm. –

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