2009-10-22 21 views
198

Trong khi chuyển đổi một dự án mà sử dụng SlimDX, và do đó có mã không được quản lý, để NET 4.0 Tôi chạy vào báo lỗi sau:'useLegacyV2RuntimeActivationPolicy' làm gì trong cấu hình .NET 4?

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

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

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

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

Trả lời

155

Sau một chút thời gian (và tìm kiếm thêm), tôi đã tìm thấy this blog entry bởi Jomo Fisher.

One of the recent problems we’ve seen is that, because of the support for side-by-side runtimes, .NET 4.0 has changed the way that it binds to older mixed-mode assemblies. These assemblies are, for example, those that are compiled from C++\CLI. Currently available DirectX assemblies are mixed mode. If you see a message like this then you know you have run into the issue:

Mixed mode assembly is built against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

[Snip]

The good news for applications is that you have the option of falling back to .NET 2.0 era binding for these assemblies by setting an app.config flag like so:

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

Vì vậy, có vẻ như cách thời gian chạy tải 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ề thay đổi này hoặc tại sao nó được thực hiện. Nhưng thuộc tính sẽ hoàn nguyên về tải CLR 2.0.

+26

Điều đáng chú ý ở đây là khi đó đánh dấu câu trả lời (http://stackoverflow.com/questions/1604663/what-does-uselegacyv2runtimeactivationpolicy-do-in-the-net-4-config/2467255#2467255) cung cấp liên kết đến giải thích kỹ lưỡng về sự thay đổi này. –

+1

Một 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 giải pháp được đề cập ở trên): http://msdn.microsoft.com/en-us/magazine/ee819091.aspx –

+0

Nếu tôi ' đã thêm điều này 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 câu hỏi mới không? – CodenameCain

116

Dưới đây là giải thích tôi đã viết gần đây để trợ 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 (Internet Archive Wayback Machine link)

Để trích dẫn các bit phù hợp nhất:

[Installing .NET] v4 is “non-impactful”. It should not change the behavior of existing components when installed.

The useLegacyV2RuntimeActivationPolicy attribute basically lets you say, “I have some dependencies on the legacy shim APIs. Please make them work the way they used to with respect to the chosen runtime.”

Why don’t we make this the default behavior? You might argue that this behavior is more compatible, and makes porting code from previous versions much easier. If you’ll recall, this can’t be the default behavior because it would make installation of v4 impactful, which can break existing apps installed on your machine.

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

+10

+1 cho việc theo dõi trễ này, lời giải thích của bạn hữu ích nhất! –

+0

Đồng ý. Lời giải thích rất tốt, quả thật vậy. – Roman

+0

@hvd: Trong khi tôi hiểu Wayback Machine khá đáng tin cậy, bạn có thể cải thiện câu trả lời này hơn nữa bằng cách trích dẫn các phần liên quan từ liên kết trực tiếp trong câu trả lời không? Cảm ơn bạn đã giúp đỡ! – BoltClock

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