什么是组织.NET跨平台开发的Visual Studio项目和代码的行业标准方法

Mar*_*ark 11 .net mono cross-platform projects-and-solutions visual-studio

我在Visual Studio中有一个相当大的C#项目解决方案.我想将其中一些项目移植到MONO中并在MAC上运行.当然有些东西不起作用,有些东西我不想移植,因为它们不适用于MAC.

一种方法是解决方案和项目配置.这允许我排除我不想构建的项目(不幸的是,Visual Studio并不能使其容易看到,但无论如何......).

可以与第一种方法协同工作的第二种方法是使用预编译器指令,例如#if MONO,然后在那时做一些事情.这很好但是它创建了同一个程序集的多个版本.如何在编译后区分这两者?这是一个问题吗?

即使前两种方法有效,有时我也想要一个大项目的一部分.我不想浏览20个左右的文件并放入#if MONO吗?我可以手工劫持项目文件,但在visual studio中没有任何可见性.除非他们卸载项目并打开XML并查看,否则团队中没有其他人可以知道发生了什么.这听起来很疯狂.更糟糕的是,有时项目会引用某些内容,我想排除MONO的引用.现在我必须编辑csproj.

我可以分割项目,但如果在某些时候我想要移植到另一个平台.平台的交叉点需要什么代码可以变得疯狂.更糟糕的是,我可以让项目引用这个大型项目,然后也可能需要拆分.这一切都有效但是会导致项目超载吗?

我找不到一个好的清洁解决方案.有小费吗?我可以遵循这个标准吗?如果VS对csproj文件的编辑有更多的可见性,这可能会起作用.

dna*_*dna 2

这是一个众所周知的编程问题,如果存在解决方案,它们通常需要一些工作,甚至在项目不是从头开始设计为可移植时需要更多工作。正如您正确指出的那样,预处理语句将很快成为一种开销,并且随着时间的推移,维护和扩展会变得非常痛苦。

然而,直接回答这个问题并不容易,因为您正在寻求的解决方案可能高度依赖于您的实施。一般来说,我建议你广泛使用众所周知的设计模式,例如Abstract FactoryBridgeFacade等。

举个例子,首先识别与平台相关的每一段代码,定义负责处理核心项目中这些特殊性的 API 接口,并将它们实现到专用项目中 - 通常每个平台一个。完成后,返回到核心项目并定义一个接口,其中包含用于实例化这些特定类的工厂方法。再次在各自的项目中实现特定的工厂。

此时,您可以在运行时通过选择将实例化您的类的工厂来决定要使用哪个后端。下一步是提供一些可插入系统来在运行时加载所需的工厂,这要归功于反射,这部分可能是最简单的部分。您检查特殊文件夹中包含的每个程序集,分析它们的类型以检测它们是否实现您的工厂接口以及是否实现:加载它们。