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.
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
@norbertB vâng, nghe có vẻ như là một cách tiếp cận tốt ở đây. – JaredPar
Đ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