2009-04-06 32 views
12

Tôi đang làm việc một dự án (sở thích thuần túy, "Làm sắc nét kỹ năng của tôi") có một kết thúc hợp nhất và nhiều giao diện người dùng (ASP.NET MVC 1.0/JQuery và Silverlight 2). Khi tôi cố gắng thêm tham chiếu đến hội đồng lớp kinh doanh của tôi trong dự án Silverlight 2 (VS2008); Nó bị từ chối, bởi vì nó không phải là một hội đồng Silverlight.Tôi làm cách nào để sử dụng các hội đồng không phải Silverlight trong ứng dụng Silverlight?

Có phải cách của họ để bao gồm và tham chiếu một hội đồng không phải Silverlight trong ứng dụng Silverlight không?

Trả lời

12

Không có. Silverlight chạy trên một CLR hoàn toàn khác mà không tương thích với CLR bình thường (máy tính để bàn). Nó có một bộ API cơ bản khác nhau trong BCL và quan trọng nhất là một số phiên bản siêu dữ liệu khác. Hai yếu tố này, trong số những yếu tố khác, ngăn các assembly được biên dịch cho CLR trên máy tính để bàn chạy mặc định trên CLR của Silverlight.

Tất cả các cụm phải được biên dịch riêng cho Silverlight.

+0

Vì vậy, tôi nên thêm mặt tiền dịch vụ web vào lớp kinh doanh của mình để sử dụng giao tiếp giữa ứng dụng Silverlight và back-end? – norbertB

+0

@norbertB vâng, nghe có vẻ như là một cách tiếp cận tốt ở đây. – JaredPar

+0

Điều này hoàn toàn đúng, tuy nhiên nếu bạn thấy liên kết thứ hai trong bài viết của tôi, ai đó sẽ đưa ra một cách thông minh để chuyển đổi các assembly .NET (desktop) thành Silverlight rất dễ dàng. Bạn nên cẩn thận mã nào bạn sử dụng trong assembly tuy nhiên (và có thể sử dụng các câu lệnh có điều kiện). – Noldorin

3

Không thể tham chiếu các hội đồng không được xây dựng dựa trên thời gian chạy Silverlight.

Cách tôi đã nhận được xung quanh nó là tạo ra một dự án mới cho hội đồng kinh doanh của tôi và sau đó thêm tất cả các lớp học từ hội đồng ban đầu vào nó. Điều quan trọng là khi bạn thêm chúng làm điều đó như một mục hiện có và trên nút Add, hãy nhấp vào mũi tên xuống và Add as Link. Bằng cách đó bạn vẫn chỉ có một cơ sở mã duy nhất mặc dù bạn có thể phải thêm một vài lớp như ApplicationException để bù đắp cho những thứ còn thiếu trong thời gian chạy Silverlight.

+0

Ngoài ra còn có một công cụ liên kết dự án có sẵn từ codeplex cho phép bạn tự động giữ hai dự án đồng bộ. Điều này lý tưởng cho các đối tượng kinh doanh. Hãy nhớ để đi SL -> .NET mặc dù, hoặc bạn sẽ có nguy cơ kết thúc với các yếu tố không thể xây dựng lại :-) –

3

Câu trả lời ngắn gọn là không, tôi sợ. Thời gian chạy Silverlight được thiết kế để trở thành một tập con của khung công tác .NET, nhưng cả hai không tương thích trực tiếp. (Các thời gian chạy được thực hiện khá khác nhau, tôi tin rằng, như Silverlight được thiết kế để có nền tảng chéo.)

Tuy nhiên, tin tốt là bạn có toàn bộ các giải pháp thay thế. This blog postthis CodeProject bài viết thảo luận vấn đề sâu và cung cấp nhiều giải pháp sạch khác nhau. Hy vọng rằng sẽ giúp ...

3

No. Nguồn csproj phải biết đó là dự án Silverlight. Điều này có thể có nghĩa là giữ hai tệp dự án với cùng một tệp ".cs". Có một csproj lừa tiện dụng ở đây - (sao chép từ protobuf-net nơi tôi làm việc này cho nhiều khuôn khổ):

<ItemGroup> 
    <Compile Include="..\YourMainProject\**\*.cs" /> 
</ItemGroup> 

Sau đó, bạn chỉ cần duy trì một dự án; dự án Silverlight lấy mọi thứ từ cây.

Lưu ý rằng Silverlight BCL bị hạn chế nhiều và không phải tất cả chức năng đều khả dụng. Lấy mã biên dịch trên cả .NET và Silverlight thông thường có thể là ... thử thách.

Hoặc, sử dụng các lớp proxy trong ứng dụng Silverlight (tức là qua WCF, v.v.). Không giàu có, nhưng đơn giản để làm.

1

Thời gian chạy Silverlight là tập con của CLR chính .Net. Mặc dù điều này có vẻ là một nỗi đau có một lý do hợp lý cho nó - thời gian chạy Silverlight cần phải đủ nhẹ để trở thành một plugin trình duyệt.

Nếu bạn đặt các lớp khác của bạn phía sau các dịch vụ web thì chúng có thể chạy trong toàn bộ thời gian chạy Net. Trong khi ứng dụng Silverlight của bạn chạy dưới CLR bị cắt trong plugin Trình duyệt.

8

Thực ra, mặc dù rất khó và có lẽ không phải là ý tưởng hay, có thể tham khảo các hội đồng CLR trong dự án Silverlight. David Betz có một ví dụ trên blog của mình: http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight

Một lần nữa điều đáng nói là bạn có thể không thực sự muốn làm điều này. Khung Silverlight đã được phát triển bởi các kỹ sư giàu kinh nghiệm, những người đã đặt rất nhiều suy nghĩ vào những gì cần được đưa vào và những gì không nên. Hãy suy nghĩ về các đối tượng CLR bạn nghĩ rằng bạn cần, và cố gắng hiểu tại sao chúng không có sẵn, và những lựa chọn thay thế là gì.

Cuối cùng, hãy nhớ rằng bất kỳ đối tượng CLR nào bạn thêm vào, sẽ làm tăng kích thước tải xuống của bạn.

2

Một lời cảnh báo, kinh nghiệm của tôi về vấn đề này xuất phát từ phát triển dành cho Windows Phone 7, vì vậy đây có thể là một cách tinh tế khác nhau từ Silverlight bình thường 3.

JaredPar đã chỉ ra sự Silverlight CLR không tương thích với CLR bình thường. Điều này không chính xác 100% vì các assembly được biên dịch như các thư viện Windows sẽ vẫn hoạt động dưới ánh sáng bạc giả định rằng chúng sử dụng các API được hỗ trợ. Bạn có thể chỉnh sửa thủ công dự án Silverlight và thêm tham chiếu vào assembly .NET bình thường. Lưu ý rằng bạn chỉ có thể thêm một tham chiếu đến một assembly được biên dịch chứ không phải dự án.

Ứng dụng Silverlight sẽ biên dịch và chạy, nhưng ngay khi ứng dụng cố gắng sử dụng lớp không có trong Silverlight, bạn sẽ gặp lỗi thời gian chạy.

Để chứng minh sự khác biệt trong API, hãy xem ảnh chụp màn hình sau đây. Như bạn có thể thấy hai assembly có một số API phổ biến, nhưng Silverlight có một vài thiếu sót. Ngay sau khi lắp ráp của bạn cố gắng để đạt những API ứng dụng đi BOOM!

Full .NET 4.0 mscorlib (System.serialization namespace):

Full .NET 4.0 mscorlib http://img188.imageshack.us/img188/2131/fullmscorlib.png

Silverlight 3 mscorlib (System.serialization namespace):

Silverlight 3 mscorlib http://img526.imageshack.us/img526/4254/sl3mscorlib.png

Những bất lợi của việc kết nối một lắp ráp đầy đủ NET là mà bạn sẽ không biết cho đến khi thời gian chạy mà các API không được hỗ trợ. Xem xét khả năng một số API hệ thống được hỗ trợ có thể sử dụng API hệ thống không được hỗ trợ, không có cách nào dễ dàng để làm việc này trước thời hạn.

Có những việc bạn có thể làm để phát triển song song dễ dàng hơn. Cách tiếp cận mà Microsoft đề xuất là có dự án riêng cho .NET và Silverlight chia sẻ cùng một mã nguồn. Bạn có thể thực hiện thủ công bằng cách thêm tệp dưới dạng liên kết đến dự án. Đó là một chút của một cơn ác mộng bảo trì, nhưng ít nhất hầu hết các lỗi sẽ bị bắt tại thời gian biên dịch.

Vì vậy, bây giờ khi bạn biên dịch một cái gì đó mà tham chiếu API mất tích trong Silverlight bạn nhận được một lỗi:

public class SerializableExample: IEquatable<string>, System.Runtime.Serialization.ISerializable 
{ 
} 

error CS0234: The type or namespace name 'ISerializable' does not exist in the namespace 'System.Runtime.Serialization' (are you missing an assembly reference?)

Với sự giúp đỡ của biên soạn có điều kiện (a-la ol tốt' C/C++ ngày), bạn có thể vô hiệu hóa nội dung không được hỗ trợ:

public class SerializableExample: IEquatable<string> 
#if !SILVERLIGHT 
    , System.Runtime.Serialization.ISerializable 
#endif 
{ 
} 

Microsoft cũng cung cấp công cụ Trình liên kết dự án cho phép bảo trì tự động các dự án có tệp được liên kết. Thật không may là bản phát hành hiện tại không chạy trên VS2010, bạn có thể biên dịch nguồn và làm cho nó xảy ra, nhưng tôi chưa thử.

http://msdn.microsoft.com/en-us/library/dd458870.aspx

liên kết tải về trực tiếp:

http://download.microsoft.com/download/6/3/8/6382E28D-2EBD-4A4E-BB76-6F425E1C9DB9/MicrosoftPracticesProjectLinkerFeb2009.msi

Microsoft page này mô tả mult-nhắm mục tiêu một cách chi tiết dữ dội.

1

Bạn đã thử cái này chưa? Nó có thể xây dựng Silverlight Assembly trực tiếp bằng cách kích chuột phải vào dự án thư viện .NET.

http://buildassilverlight.codeplex.com/

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