我正在进行一个项目(纯粹的业余爱好,“磨练技能”),它有一个统一的后端和多个前端(ASP.NET MVC 1.0/JQuery 和 Silverlight 2)。当我尝试在 Silverlight 2 项目(VS2008)中添加我的业务层程序集时,它被拒绝了,因为它不是 Silverlight 程序集。
有没有一种方法可以在 Silverlight 应用程序中包含和引用非 Silverlight 程序集?
我正在进行一个项目(纯粹的业余爱好,“磨练技能”),它有一个统一的后端和多个前端(ASP.NET MVC 1.0/JQuery 和 Silverlight 2)。当我尝试在 Silverlight 2 项目(VS2008)中添加我的业务层程序集时,它被拒绝了,因为它不是 Silverlight 程序集。
有没有一种方法可以在 Silverlight 应用程序中包含和引用非 Silverlight 程序集?
不,没有。Silverlight运行在完全不同的CLR上,与正常的(桌面)CLR不兼容。它在BCL中有一个不同的API集,并且最重要的是有一个不同的元数据版本号。这两个因素等等阻止了为桌面CLR编译的程序集默认在Silverlight CLR上运行。
所有程序集都必须专门为Silverlight编译。
不行。源csproj必须知道它是一个Silverlight项目。这可能意味着需要保留两个具有相同源“.cs”文件的项目文件。这里有一个方便的csproj技巧 - (从protobuf-net复制而来,在那里我为多个框架执行此操作):
<ItemGroup>
<Compile Include="..\YourMainProject\**\*.cs" />
</ItemGroup>
那么,您只需要维护一个项目;Silverlight项目从树中获取所有内容。
请注意,Silverlight BCL受到严格限制,并非所有功能都可用。编写适用于常规.NET和Silverlight的代码可能会有难度。
或者,在Silverlight应用程序中使用代理类(例如通过WCF等)。虽然不够丰富,但操作简单。
无法引用未针对Silverlight运行时构建的程序集。
我解决此问题的方法是为我的业务程序集创建一个新项目,然后将原始程序集中的所有类添加到其中。关键是在添加它们时,将其作为现有项目添加,并在添加按钮上单击向下箭头并选择“添加为链接”。这样,您仍然只有一个代码库,尽管您可能需要添加一些类,例如ApplicationException,以弥补Silverlight运行时缺少的内容。
System.serialization
命名空间):
完整的 .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
链接完整的.NET程序集的缺点是,直到运行时你才会知道哪些API不受支持。考虑到潜在地一些受支持的系统API可能使用不受支持的系统API,因此没有简单的方法可以提前解决这个问题。
有一些事情可以让并行开发更容易。Microsoft推荐的方法是为.NET和Silverlight分别创建项目,它们共享相同的源代码。您可以通过将文件作为链接添加到项目中来手动执行此操作。这可能会导致维护上的一些麻烦,但至少大多数错误都会在编译时被捕获。
因此,现在当您编译引用Silverlight缺失API的内容时,您会收到一个错误:
public class SerializableExample: IEquatable<string>, System.Runtime.Serialization.ISerializable
{
}
public class SerializableExample: IEquatable<string>
#if !SILVERLIGHT
, System.Runtime.Serialization.ISerializable
#endif
{
}
http://msdn.microsoft.com/en-us/library/dd458870.aspx
直接下载链接: 这个Microsoft页面详细描述了多目标定位。Silverlight 运行时是主 .Net CLR 的一个子集。虽然这看起来可能很麻烦,但有一个明智的原因 - Silverlight 运行时需要足够轻便以成为浏览器插件。
如果将其他类放置在 Web 服务后面,则可以在完整的 .Net 运行时下运行它们,而 Silverlight 应用程序则在浏览器插件中使用精简的 CLR 运行。