2010-07-16 9 views
23

Nếu tôi có lắp ráp 2.0 CLR (mã được quản lý thuần túy, không có vấn đề về chế độ hỗn hợp) mà tôi cần liên kết đến từ Ứng dụng 4.0 CLR, mã 2.0 có chạy trên 2.0 CLR hoặc 4.0 không.Khi liên kết một hội đồng quản trị .NET 2.0 từ một ứng dụng .NET 4.0, khung công tác nào được sử dụng?

Về cơ bản, có bất kỳ rủi ro nào về các thay đổi đột phá 4.0 ảnh hưởng đến mã 2.0 không?

Trả lời

17

Câu trả lời ở trên không chính xác. Bạn làm quen với các khung công tác đầy đủ. A .Net 2 APPLICATION (lưu ý rằng có nghĩa là EXE, không phải thư viện) sẽ không tự động quảng cáo đến .Net 4.

Nhưng nếu ứng dụng .Net 4 tải một assembly .Net 2 thì nó được nạp vào cùng một thời gian chạy (nếu không thì làm thế nào họ có thể chia sẻ thông tin) không. Các .Net 2 lắp ráp được nạp vào thời gian chạy .net 4 sử dụng một chế độ tương thích được cho là để giảm thiểu vỡ trong thay đổi (chủ yếu là cho những thay đổi an ninh trong .Net 4).

Lắp ráp .Net 2 không thể tham chiếu đến hội đồng .Net 4 vì nó không có tính năng.

Ngoại lệ duy nhất cho điều này mà tôi biết là nếu bạn tải một hội đồng .Net từ ứng dụng C++. Ứng dụng C++ có thể tải và lưu trữ hai runtimes. Nó có thể có một .Net 2 lắp ráp và một .Net 4 lắp ráp nạp, nhưng họ sẽ không thể nói chuyện với nhau trực tiếp. Đây là cách CLR Procs làm việc trong SQL Server. Bạn có thể có một .Net 2 CLR Proc và một .Net 4 CLR Proc mà không giao tiếp, nhưng đều được nạp trên máy chủ.

Đã có một bài viết tuyệt vời trên tạp chí MSDN về việc lưu trữ khung .Net gần đây, nhưng bây giờ tôi không thể tìm thấy nó. Có thể ai đó khác có thể đăng liên kết.

Vì vậy, bạn sẽ có thể tải chỉ là về bất kỳ .Net 2 lắp ráp vào một thực thi .Net 4 mà không có nhiều vấn đề. Các vấn đề duy nhất tôi đã thấy là với các điều khoản bảo mật.

+1

Không biết nếu bạn đang nói về bài viết "CLR Hosting API": msdn.microsoft.com/en-us/magazine/cc163567.aspx – user276648

6

Về cơ bản, có bất kỳ rủi ro nào về các thay đổi đột phá 4.0 ảnh hưởng đến mã 2.0 không?

Không. Bắt đầu với .NET 4, bạn không phải lo lắng về các vấn đề tương thích ! Phiên bản 4 đã giới thiệu một tính năng mới có tên là "In-Process Side-by-Side Execution", về cơ bản cho phép bạn tải nhiều phiên bản của CLR vào cùng một quy trình.

Nói cách khác, vì ứng dụng chính của bạn đang chạy trên thời gian chạy 4.0, bạn có thể yêu cầu nó tải thời gian chạy 2.0 khi bạn tải lắp ráp 2.0 CLR. Việc lắp ráp 2.0 CLR sẽ sử dụng thời gian chạy 2.0, trong khi ứng dụng của bạn sẽ tiếp tục sử dụng thời gian chạy 4.0.

Bạn chỉ định điều này như thế nào? Tôi tin rằng bạn chỉ có thể thêm một tập tin cấu hình cho lắp ráp 2.0 CLR của bạn (ví dụ: "My.dll.config" trong cùng thư mục với "My.dll"), nhưng tôi đã không thử nó với DLLs bản thân mình. Tuy nhiên, đây là những gì bạn đặt trong tập tin cấu hình của assembly của bạn:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v2.0.50727" /> 
    </startup> 
</configuration> 
+0

Điều này là đúng, theo tài liệu. Tuy nhiên, có vẻ như đôi khi trình biên dịch C# sẽ thêm và các hội đồng v2.0 bí danh mà sau đó gây ra các vấn đề tải. Bạn có thể giải thích điều này? Đây là một ví dụ: http: // stackoverflow.com/questions/3841911/link-to-a-net-v2-0-assembly-từ-a-net-v4-0-assembly-cũng-xuất hiện-tới-liên kết-a – codekaizen

+0

Cảm ơn câu trả lời, nhưng tôi đã đưa ra này đi bằng cách tạo ra một dự án thử nghiệm nhanh chóng. Tôi có một ứng dụng giao diện điều khiển chạy 4.0 và thư viện lớp đang chạy 3.5. Tôi đã tạo một tệp cấu hình như được chỉ định và Environment.Version là 4.0 cho cả hai. – AlexWilson

+0

Tệp cấu hình sẽ không hoạt động đối với một tệp DLL. Nó cần phải được thêm vào tệp cấu hình .EXE, vì đó là những gì được tải bởi thời gian chạy. – codekaizen

1

nếu câu trả lời từ HTW không trả lời điều đó cho bạn, hoặc nó bị treo trên bạn. Hãy xem điều này

http://msmvps.com/blogs/rfennell/archive/2010/03/27/mixed-mode-assembly-is-built-against-version-v2-0-50727-error-using-net-4-development-web-server.aspx

+0

Người đàn ông, tôi đã làm điều này trước và hoàn toàn quên về app.config này Cảm ơn bạn đã đăng bài này. Đã làm việc này trong nhiều giờ và đây là giải pháp. – TravisWhidden