C# NET和Silverlight之间共享代码的可行性?
我刚刚经历了一个小的实验环节,试图看看将我们的.NET类库(或至少部分类库)引入Silverlight需要做多少工作,以便我们可以在两个世界之间重用业务逻辑,我想知道其他人是否有这方面的经验 我注意到的事情,在我的脑海里:C# NET和Silverlight之间共享代码的可行性?,c#,.net,silverlight,sharing,C#,.net,Silverlight,Sharing,我刚刚经历了一个小的实验环节,试图看看将我们的.NET类库(或至少部分类库)引入Silverlight需要做多少工作,以便我们可以在两个世界之间重用业务逻辑,我想知道其他人是否有这方面的经验 我注意到的事情,在我的脑海里: 缺少很多属性(例如可浏览(false)) 大量接口缺失或存在,但为空(iClonable隐藏,ITypedList缺失) 反映差异(所有可访问的内容都需要公开) 一些基本类差异(无组件?) 所以我想知道,我真的可以把它看作一种可能性吗 我运行了最初的代码,但我不得不注释掉
- 缺少很多属性(例如可浏览(false))
- 大量接口缺失或存在,但为空(iClonable隐藏,ITypedList缺失)
- 反映差异(所有可访问的内容都需要公开)
- 一些基本类差异(无组件?)
值得吗?这当然需要更多的研究。这绝对是可行的 这是在这里的一个项目上完成的;Silverlight项目包括C#one,有一些
#IF
语句处理一些事情(比如log4net声明),其他时候只是重新实现了一些事情。但总的来说,这是一场巨大的胜利,你绝对应该尝试一下(当然,我们已经成功了)
--编辑:
不过有一点是,我们的OR/M(LLBLGen)没有内置对通过Silverlight发送的“简单”对象的支持;但是有人写了一个插件来处理它,这很有帮助。因此,有必要考虑您正在使用哪种DAL,以及它对Silverlight的支持程度。我为促进这一点所做的工作是:
今天我正在将一些.NET代码移植到Silverlight,这些代码大量使用了System.Diagnostics API,如TraceSource、SourceSwitch等,而Silverlight中不存在这些API。我在Silverlight项目中创建了这些的最小实现,并将它们放在Einstein.Diagnostics名称空间中。在这样做的过程中,我决定我需要一个约定来轻松识别模仿.NET框架的代码和我自己的代码。因此,我重命名了占位符文件,以使用@符号作为前缀。我还在这些文件中为类名加前缀。有趣的是,就C#编译器而言,@符号实际上并没有改变它们的类名。因此@SourceSwitch仍然编译为Einstein.Diagnostics.SourceSwitch,但在代码中我可以很容易地看到一些问题。我还用[SilverlightPlaceholder]属性修饰了这些类。我使用protobuf net完成这项工作,并使用了以下几种方法:
- 在项目文件中使用条件编译符号来触发微妙的代码分支(是的,它并不完美,但可以工作)
- 重新介绍一些东西;这里的属性可能就是一个例子——您的代码仍然可以使用重新引入的属性,即使框架代码没有这样做;作为一个更极端的例子,对于compact framework,我不得不重新引入一个很好的
表达式
API,这很有趣
- 放下一些东西-p
然而如果您使用的是
ITypedList
(您提到的),我可以看到整个方法非常混乱;组件模型已经足够复杂了,不必强行通过黑客攻击。这完全取决于你在这条路上走了多远。也许4.0/dynamic
会再次打开其中的一些选项?解决问题的一个可能方法是从Mono项目中复制缺少的代码。当时,我用Compact Framework做了一个小项目,但它缺少整个System.XLM名称空间。我只是将Mono的全部内容复制到我的项目中,对其进行了编译,并且只做了极小的更改,效果非常好,iirc。好的,很好,那么你就没有遇到任何我认为无法克服的问题了。很高兴听到你这么说,那么我一定会继续