如何编写一个类库,可以在.NET 3.5紧凑框架和常规框架上运行?

10
我怎样编写一个.NET类库,以便可以重新编译为常规的.NET 3.5框架或.NET 3.5紧凑框架?
3个回答

14

很遗憾,这两个框架不是二进制兼容的*,但不要让这阻止你。

在解决方案中创建两个项目(一个普通的类库项目,一个紧凑框架的类库项目),然后通过单击“添加|现有文件”并在文件对话框上选中“添加链接”复选框,将一个项目中的所有文件添加到另一个项目中。

现在,您只需要维护一组源代码,但您的解决方案将同时构建两个DLL。

如果您有任何特定于桌面框架并且在紧凑框架上无法工作的文件中的代码,可以像这样在编译器指令中包装它(至少在C#中):

#if PocketPC
    // mobile-specific stuff here
#else
    // desktop-specific stuff here
#endif
  • 请注意,尽管您无法在移动平台上使用桌面框架二进制文件,但相反是可以的。精简框架可执行文件可以在桌面上运行。但是,我非常确定桌面应用程序无法引用精简框架程序集(尽管我从未尝试过)。

3
我一直成功地运行桌面应用程序和引用紧凑框架程序集的ASP.Net网站。似乎这没有任何问题... - Johan Kullbom
实际上...这是否意味着您必须在目标计算机上安装紧凑框架?或者如果可用,NETCF程序集是否使用桌面框架? - Matt Hamilton
不需要在目标机器上安装Compact Framework,因此必须使用桌面程序集。据我记得,在MSDN上有一份相当全面的关于这个问题的文档,但我现在找不到它了... - Johan Kullbom
是的,它只能在CLR桌面版下运行。因此,如果你要在两者之间共享代码,了解FF和CF之间的区别是很有价值的。我在这里列出了一份非常不完整的清单:https://dev59.com/CnRC5IYBdhLWcg3wS_IF - Quibblesome

5
  1. 创建一个适用于紧凑框架的类库。
  2. 从您的.exe项目(桌面或移动设备)中引用该库。
  3. 赚钱!

说真的,我不知道为什么排名靠前的答案会如此受欢迎。您根本不需要两个独立的项目。我也不喜欢预处理器指令,它们很丑陋,并且在处理构建参数时需要额外的知识。将所有不兼容的部分外包到接口(例如IPlaformServices)中更加美观,甚至您可以直接询问:

   if(Environment.OSVersion.Platform == PlatformID.WinCE)
   {
       // winCE specific     
   }
   else
   {
       // desktop specific
   }

在我看来,这两种方法比预处理指令更好。


4
预处理指令意味着如果在特定平台上不需要(或不支持)代码,则该代码不会出现在汇编中。这在紧凑框架上非常重要,因为您希望尽可能地减小程序集的大小。 - Matt Hamilton
1
说得好。如果磁盘空间和内存是紧迫的问题,那么使用一个预处理器命令来生成您的IPlatformServices即可。但是,如果它们散布在整个代码库中,那将是非常困难的,因此我不建议采用这种方法。 - Quibblesome

5

> 这两个框架不是二进制兼容的 >

实际上,桌面版可以加载和运行CF程序集。


啊,是的,没错。加一分,我会修改我的回答。 - Matt Hamilton
dotnetcf3.5与桌面版兼容。但在dotnetcf3.7中不再兼容,但它与Silverlight兼容。有关详细信息,请参见http://blogs.msdn.com/b/abhinaba/archive/2010/03/18/comparing-windows-phone-with-net-compact-framework-3-5.aspx。 - k3b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接