2010-03-04 17 views
30

Tôi đang gặp phải một số sự cố khi sử dụng thư viện .NET 4.0 trong các ứng dụng .NET 2.0. Tôi đoán tôi đã được ấn tượng rằng là một DLL Windows, các ứng dụng .NET khác của tôi sẽ có thể truy cập nó. đây không phải là trường hợp? Bất kỳ đề xuất nào về hỗ trợ các ứng dụng trong cả hai môi trường?Tôi có thể sử dụng thư viện .NET 4.0 trong ứng dụng .NET 2.0 không?

EDIT: Tôi nhận ra rằng tôi cần cài đặt .NET 4.0 Framework trên hệ thống đích, có những lý do nào khác khiến việc này không hoạt động không?

EDIT: Có lẽ phải cụ thể hơn. Chúng tôi có một ứng dụng hiện tại, lớn/phức tạp, được viết bằng .NET 2.0 (ASP.NET chính xác). Chúng tôi có một bộ công cụ tích hợp mới và các mục công việc mà chúng tôi đang ghi trong .NET 4.0. Chúng tôi muốn thêm một trong số 4.0 thư viện được tạo vào dự án .NET 2.0 (hiện tại trong VS2008) và sử dụng một vài phương pháp của nó. Khi chúng tôi làm điều này, chúng tôi gặp phải vấn đề, thường là các lỗi khó hiểu liên quan đến bộ nhớ.

Có vẻ như cả Earwicker và Brian Rasmussen đều đúng vào cuối. Vì tôi không quá quan tâm đến việc phơi bày mọi thứ qua COM (không chắc chắn nếu đây là kỹ thuật COM hay không nhưng bất kể) Tôi nghĩ tôi sẽ dính vào ý tưởng rằng cả hai không 'tương thích' và nhìn vào các phương tiện khác, mà tôi nghĩ chúng tôi đã dựa trên nhu cầu cụ thể của chúng tôi. Về lâu dài, chúng ta sẽ xem xét để di chuyển mã .NET 2.0 lên tới 4.0.

+0

Bạn đang cố gắng sử dụng một phiên bản .NET 4.0 dưới * ASP.NET * 2.0? Số phiên bản ở đây có thể gây nhầm lẫn. –

+0

hãy để tôi hỏi câu hỏi ngu ngốc tại sao bạn sẽ biên dịch cho net 2.0 khi bạn có net 4.0? o.O chỉ cần thực hiện một nỗ lực và viết lại các bộ phận cung cấp cho cảnh báo/lỗi – Aviatrix

Trả lời

23

Có, điều này là hoàn toàn có thể. Bạn chỉ hiển thị các thành phần được viết trong 4.0 dưới dạng đối tượng COM. Các ứng dụng lưu trữ 2.0 chỉ sử dụng chúng như là đối tượng COM và không có ý tưởng cho dù họ là bản địa, 2.0, 4.0 hoặc bất cứ điều gì. COM là giao diện chung mà cả hai phiên bản thời gian chạy phải thực hiện giống hệt nhau.

Hỗ trợ SxS trong quá trình mới có nghĩa là khi đối tượng COM dựa trên 4.0 được tải, nó sẽ kéo trong thời gian chạy yêu cầu thay vì cố gắng chạy trên 2.0, vì vậy cả hai thời gian có mặt trong quá trình quản lý đối tượng riêng. Mặc dù bạn không thể trực tiếp vượt qua các đối tượng CLR giữa chúng, bạn có thể vượt qua các giao diện COM, và CLR minh bạch bao bọc các đối tượng của bạn trong các giao diện COM cho bạn.

Tôi không biết liệu bạn có thể thực hiện một lắp ráp interop đơn cho cả hai phiên bản hoạt động. Nhưng rõ ràng bạn có thể viết một hội đồng interop trong C# trong 2.0, xuất khẩu nó vào một .tlb, và sau đó nhập nó vào một hội đồng trong 4.0.Điều đó cung cấp cho bạn hai hội đồng interop tương ứng mô tả các giao diện COM giống hệt nhau. (Hoặc chỉ xây dựng cùng một nguồn C# trong mỗi dự án lắp ráp của phiên bản).

Cập nhật tiền thưởng: Ứng dụng kết quả có dựa trên COM (với bất kỳ vấn đề nào đòi hỏi) không?

Nó phụ thuộc vào cách bạn nhìn vào nó. Tác giả của các thành phần sẽ làm cho chúng thành các thành phần COM. Vì vậy, các ứng dụng máy chủ cần phải xác định vị trí và tải chúng như là các thành phần COM. Điều này có nghĩa là lừa xung quanh với GAC, đăng ký hoặc SxS biểu hiện, mà là rất ít sạch hơn chỉ cần nói với các tác giả thành phần để thả lắp ráp của họ trong một thư mục nhất định để bạn có thể tải nó với sự phản ánh.

Và nó có tác động vào thời gian chạy: khi máy chủ có tham chiếu đến một thành phần, sẽ không có một đối tượng nào nhưng ba các đối tượng liên quan. Các máy chủ có một tham chiếu đến một RCW, trong đó có một con trỏ đến một giao diện COM thực hiện bởi một CCW, do đó giữ một tham chiếu đến các thành phần thực tế. CCW ở giữa là đối tượng COM được tính tham chiếu và RCW của máy chủ có trình hoàn tất gọi số Release trên CCW và khi nó bị hủy, nó sẽ giải phóng GCRoot đang giữ nguyên thành phần thực tế. Điều này có nghĩa là - với sự sắp xếp đầy đủ phức tạp của các con trỏ gọi lại, vv - hệ thống có thể kết thúc với các vấn đề đếm tham chiếu vòng tròn, trong đó một "hòn đảo" bị ngắt kết nối của tất cả các đối tượng đều giữ tham chiếu với nhau và vì vậy chúng không bao giờ được deallocated.

+0

Đó là suy nghĩ của tôi một cách chính xác.Tôi sẽ không khuyên bạn nên điều này mặc dù, vì nó không phải là trực quan như cách NET bình thường. Bạn vẫn cần .NET 4 trên máy tính của bạn, vì thư viện mà bạn tham khảo vẫn sử dụng nó. –

+1

Khi bạn nói bạn sẽ không giới thiệu nó - bạn sẽ đề nghị gì khác cho ai đó muốn hỗ trợ các trình cắm thêm .NET 4.0 cho ứng dụng nền tảng cơ bản .NET 2.0? Hoặc ngược lại? Đó là chính xác những gì tính năng này của 4.0 đã được phát triển để hỗ trợ. Không có cách nào khác "bình thường" để làm điều này - nó chưa bao giờ có thể xảy ra trước đây. –

+1

Bạn nên cân nhắc di chuyển phần 2.0 sang .net 4.0, nếu cần .net 4.0. bằng cách này bạn không có dấu chân của cả hai khung công tác và có thể sử dụng các tính năng mới trong codebase của riêng bạn. –

10

Xin lưu ý rằng phiên bản 4.0 không chỉ là các hội đồng bổ sung. Bản thân thời gian chạy cũng đã được thay đổi trong phiên bản này (chế độ GC đồng thời mới, nhiều thay đổi đối với nhóm luồng, mscorwks.dll giờ được gọi là clr.dll, v.v.).

+0

Vì vậy, tôi không thể biên dịch của tôi. NET 4.0 thư viện trong một số cách mà sẽ phơi bày chính nó như là một Windows DLL truyền thống? Các máy trạm mục tiêu sẽ có các.NET 4.0 Framework cài đặt, đó là không đủ? –

+0

@Douglas Anderson - vâng, bạn có thể. –

+1

@Douglas Anderson: Như Earwicker chỉ ra 4.0 hỗ trợ tải các runtimes khác nhau cạnh nhau (có một bài báo trên tạp chí MSDN gần đây về chủ đề này). Tuy nhiên, nó không phải cho tôi những gì bạn đang cố gắng để làm, vì vậy tôi chỉ muốn chỉ ra rằng không giống như các phiên bản trước thời gian chạy đã được cập nhật là tốt cho phiên bản này. –

0

Lắp ráp của bạn được biên soạn cho .NET 4 sẽ chứa tham chiếu đến các thư viện khung công tác .NET 4 khác không có trong .NET 2.0.

Nếu bạn muốn ứng dụng của mình tương thích với .NET 2.0, bạn có thể sử dụng Visual Studio 2005 hoặc target dự án của mình lên .NET 2.0 nếu bạn đang sử dụng Visual Studio 2008 hoặc 2010. Tất nhiên, nếu bạn nhắm mục tiêu dự án của mình. NET 2.0 bạn sẽ không thể tận dụng các tính năng .NET 3.5/4.

3

Có thể tùy thuộc vào cách bạn đang sử dụng. Trong .Net 4.0, bạn có tùy chọn của In Process Side by Side Execution (InProc SxS). Điều này cho phép bạn lưu trữ hai phiên bản CLR khác nhau trong cùng một không gian quy trình. Đây là explained here.

Cho dù bạn có thể tận dụng điều này trong situtaion của bạn, tôi không biết. Tôi không có kinh nghiệm trực tiếp để giúp bạn.

Một số scenarios trong đó điều này có thể được sử dụng.

1

Có vẻ như tính năng song song đang được thêm vào CLR 4 sẽ không giúp ích trong trường hợp này vì anh ta muốn sử dụng thư viện .NET4.0 trong ứng dụng .NET2.0. Theo tôi hiểu, SxS trong quá trình sẽ hữu ích nếu trường hợp ngược lại (tiêu thụ .NET2.0 trong ứng dụng .NEt4.0) vì CLR của 4.0 sẽ hoạt động song song với 2.0 trong cùng một quy trình ..

0

Tôi đã có một vấn đề tương tự với ứng dụng của tôi, nơi tôi đã không thể tham khảo một API, đã được sử dụng .net 4.0 thành phần.
Để giải quyết điều này, tôi đã tạo một dự án thư viện lớp mới đã tham chiếu dự án .net 4.0 của tôi và sau đó được gọi là assembly mới từ dự án .net 2.0 của tôi. Tôi đã ánh xạ dữ liệu đến từ dự án .net 4.0 để được sử dụng bởi dự án .net 2.0 của tôi.
Điều đó giải quyết được vấn đề của tôi.

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