'UseLegacyV2R.78ActivationPolicy' làm gì trong cấu hình .NET 4?


214

Trong khi chuyển đổi một dự án sử dụng SlimDX và do đó có mã không được quản lý, sang .NET 4.0, tôi đã gặp phải lỗi sau:

Việc lắp ráp chế độ hỗn hợp được xây dựng dựa trên phiên bản 'v2.0.50727' của thời gian chạy và không thể được tải trong thời gian chạy 4.0 mà không có thông tin cấu hình bổ sung.

Googling xung quanh đã cho tôi giải pháp, đó là thêm phần này vào cấu hình ứng dụng:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Câu hỏi của tôi là, đang useLegacyV2RuntimeActivationPolicylàm gì? Tôi không thể tìm thấy bất kỳ tài liệu về nó.

Câu trả lời:


165

Sau một thời gian (và tìm kiếm nhiều hơn), tôi đã tìm thấy mục blog này của Jomo Fisher.

Một trong những vấn đề gần đây mà chúng tôi gặp là, vì sự hỗ trợ cho thời gian chạy song song, .NET 4.0 đã thay đổi cách liên kết với các cụm chế độ hỗn hợp cũ hơn. Các tập hợp này, ví dụ, các tập hợp được biên dịch từ C ++ \ CLI. Hiện tại các hội đồng DirectX có sẵn là chế độ hỗn hợp. Nếu bạn thấy một thông báo như thế này thì bạn biết bạn đã gặp phải vấn đề:

Việc lắp ráp chế độ hỗn hợp được xây dựng dựa trên phiên bản 'v1.1.4322' của thời gian chạy và không thể được tải trong thời gian chạy 4.0 mà không có thông tin cấu hình bổ sung.

[Bắn tỉa]

Tin vui cho các ứng dụng là bạn có tùy chọn quay lại ràng buộc kỷ nguyên .NET 2.0 cho các hội đồng này bằng cách đặt cờ app.config như vậy:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>

Vì vậy, có vẻ như cách thời gian chạy tải các cụm chế độ hỗn hợp đã thay đổi. Tôi không thể tìm thấy bất kỳ chi tiết nào về sự thay đổi này, hoặc tại sao nó được thực hiện. Nhưng useLegacyV2RuntimeActivationPolicythuộc tính trở lại tải CLR 2.0.


28
Điều đáng chú ý ở đây là câu trả lời marklios ( stackoverflow.com/questions/1604663/ mẹo ) cung cấp một liên kết đến lời giải thích kỹ lưỡng của anh ấy về sự thay đổi này.
Steffen Opel

1
Một lời giải thích kỹ lưỡng về điều này có thể được tìm thấy trên MSDN (Mặc dù nó không đề cập rõ ràng đến giải pháp được đề cập ở trên): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane

Điều gì sẽ xảy ra nếu tôi đã thêm nó vào cả cấu hình cho ứng dụng của tôi và cấu hình cho dự án UnitTest của tôi và tôi vẫn nhận được lỗi tải tệp khi chạy thử nghiệm. Tôi có nên đăng một câu hỏi mới?
CodenameCain

126

Đây là một lời giải thích tôi đã viết gần đây để giúp đỡ với khoảng trống thông tin về thuộc tính này. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (liên kết máy lưu trữ Internet Wayback)

Để trích dẫn các bit có liên quan nhất:

[Cài đặt .NET] v4 là loại không ảnh hưởng của Nether. Nó không nên thay đổi hành vi của các thành phần hiện có khi cài đặt.

Về cơ bản, thuộc tính useLegacyV2R.78ActivationPolicy cho phép bạn nói, tôi có một số phụ thuộc vào các API shim kế thừa. Vui lòng làm cho chúng hoạt động theo cách chúng đã sử dụng đối với thời gian chạy đã chọn.

Tại sao chúng ta không biến điều này thành hành vi mặc định? Bạn có thể lập luận rằng hành vi này tương thích hơn và làm cho việc chuyển mã từ các phiên bản trước trở nên dễ dàng hơn nhiều. Nếu bạn nhớ lại, đây không thể là hành vi mặc định vì nó sẽ khiến việc cài đặt v4 trở nên mạnh mẽ, có thể phá vỡ các ứng dụng hiện có được cài đặt trên máy của bạn.

Bài viết đầy đủ giải thích điều này chi tiết hơn. Tại RTM, các tài liệu MSDN về điều này sẽ tốt hơn.


user20493, bạn có thể chạy ứng dụng của mình với biến môi trường COMPlus_CLRLoadLogDir được đặt thành một thư mục trống mà ứng dụng có quyền truy cập và chia sẻ nhật ký kết quả (vui lòng xóa bất kỳ PII nào trước khi chia sẻ). Nó có thể giúp giải thích những gì đang xảy ra. Thuộc tính cấu hình có thể không được áp dụng cho bối cảnh ứng dụng của bạn đang chạy.
Đánh dấu Miller

Liên kết này cũng sẽ giúp bạn hiểu vấn đề là gì và giải pháp đang làm gì cho bạn: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.