多目标.NET库的最佳实践

时间:2010-11-16 23:53:44

标签: .net silverlight windows-phone-7 xna

我计划发布一个开源(MIT).NET库,但也包括DLL,以方便人们使用,因此他们不必自己编译所有内容。

我的库在它引用的类型中非常简单,唯一真正的依赖似乎是.NET 3.0或更高版本(因为它引用了Func<T>之类的东西)。

我希望我的库可以被多个目标使用,包括.NET 4.0服务器,.NET 3.5服务器,Windows Phone 7 Silverlight,普通Silverlight,XNA(电话),XNA(Windows)和XNA(XBox 360)。

我确保不使用我所定位的平台上没有的任何类型,例如HashSet<T>在Windows Phone 7上不可用,所以我没有使用它。

我是否需要针对每个目标制作不同的项目,因此需要多个DLL,或者是否有某种方法可以为它们生成一个共同的DLL?

5 个答案:

答案 0 :(得分:7)

今年PDC有一篇关于做这类事情的演讲:

This is the videothese are the slides

答案 1 :(得分:4)

使用共享的公共源文件分离项目文件是可行的方法。确保将项目设置为构建到不同的输出文件夹(例如,不是\bin\Debug,而是\CF\bin\debug),以防止从多个目标(如桌面和设备项目)使用库时产生烦恼。

OpenNETCF.IoC framework就是一个例子 - 它支持桌面,CF,Windows Phone和MonoTouch都具有相同的源文件,但每个平台都有单独的项目文件。试图编译成一个可用于所有这些的二进制程序集太乱了,难以维护。

这里的主要痛点是在添加/更改文件并确保所有文件始终编译时保持所有项目文件同步。如果您有权访问自动化(不幸的是,Codeplex不会公开),构建服务器就可以这样做。

答案 2 :(得分:2)

我使用针对.NET和Silverlight的库做类似的事情。我有一组源文件和单独的项目文件链接到相同的共享文件。

有时我使用条件编译来包含仅适用于.NET而不是Silverlight的功能,或者利用.NET中可用的功能来实现更好的实现,并且在Silverlight存在间隙的情况下实现后备实现。

同样的方法可以用于你提到的其他平台 - 一组源文件,但是每个平台目标都有一个单独的项目文件。

如果您使用像MSBuild或NAnt这样的构建工具,则可以在运行脚本时让构建为所有目标平台生成所有DLL。

答案 3 :(得分:2)

查看 BLC小组(微软)Portable Library Tools(上次更新时间:2011年6月17日)扩展程序及此简介MSDN article(上次更新时间:2011年8月)

答案 4 :(得分:0)

我建议为每个平台建立一个库。让我解释一下。

假设完整的.NET Framework包含许多功能,这些功能不属于.NET Compact Framework的一部分,可能是Windows CE和智能手机的一部分。因此,为了充分利用每个平台的全部可能性,我将利用公共库充足的接口,然后在.NET Framework platform specific类库中实现这些接口,这将使您能够充分利用在特定平台上提供的内容。

另一方面,如果共同重用代码,并且为了可维护性,您可能更愿意使用单个“do-them-all”库。根据这些要求,您需要充分了解您希望支持的众多平台之间的每个差异。

这显然是一个重要的分析和架构问题,因为两者都将缺乏一个平台而不是另一个平台。

以下是我将如何处理这种情况:

  1. 我会调查特定于平台的.NET Framework之间的差异;
  2. 我会把你认为可能需要的所有共同物品(根据需要)放在一边;
  3. 我会强调差异,即您可以在一个平台下使用的对象,而不是另一个平台;
  4. 这是您必须执行的有机分析,以便了解接下来会发生什么。

    也就是说,对于某种瀑布式方法。


    对于Scrum方法,如果我可以这么说,这表明经验主义,我会说为他们尝试一个共同的库,看看你能做什么。如果你遇到了一些你绝对不能做的事情,那么可能只需要创建另一个类库来依赖你的“do-them-all”库,这样你就可以为每个平台创建一个公共块,然后是其他一些特定的块。图书馆为你不能做的共同点。这样做,看看你从中获得了什么好处,并找到摆脱困境的方法,以便更具体时间。