我在Visual Studio中有一个相当大的C#项目解决方案。我想将其中一些项目移植到MONO中并在MAC上运行。当然有些东西不起作用,有些东西我不想移植,因为它们不适用于MAC。
一种方法是解决方案和项目配置。这允许我排除我不想构建的项目(遗憾的是,Visual Studio不会让它变得容易看到,但无论如何......)。
第二种可以与第一种方法协同工作的方法是使用预编译器指令,例如#if MONO,然后在那一点做一些事情。这很好但是它创建了同一个程序集的多个版本。如何在编译后区分这两者?这是一个问题吗?
即使前两种方法有效,有时我也想要一个大项目的一部分。我不想浏览20个左右的文件并把#if MONO用来?我可以手工劫持项目文件,但在visual studio中没有任何可见性。除非他们卸载项目并打开XML并查看,否则团队中没有其他人可以告诉他们发生了什么。这听起来很疯狂。更糟糕的是,有时项目会引用某些内容,我想排除MONO的引用。现在我必须编辑csproj。
我可以分割项目,但如果在某些时候我想要移植到另一个平台。平台的交叉点需要什么代码可以变得疯狂。更糟糕的是,我可以让项目引用这个大型项目,然后也可能需要拆分。这一切都有效,但会导致项目超载吗?
我找不到一个好的清洁解决方案。有小费吗?我可以遵循这个标准吗?如果VS能够更好地了解csproj文件的编辑,那么这可能会有效。
答案 0 :(得分:3)
您还可以设置文件夹结构并将解决方案拆分为通用解决方案,该解决方案包含独立于平台的项目和包含特定于平台的项目的特定于平台的解决方案。
例如,一个包含所有常见项目的application.sln,为了论证,我们还有一个iOS和Android解决方案。
在特定于平台的解决方案中,您可以通过向平台特定项目添加“[application]”文件夹以及其他常见项目子文件夹来引用常见项目。连续添加所有必需的公共文件作为链接。
以上答案是您可能的一种可能性:
答案 1 :(得分:2)
这是一个众所周知的编程问题,如果存在解决方案,它们通常需要一些工作,甚至当项目不是从头开始设计为可移植时甚至更多。正如您正确指出的那样,预处理语句很快就会成为一种开销,并且会随着时间的推移而变得非常痛苦。
然而,直接回答这个问题并不容易,因为您寻求的解决方案可能高度依赖于您的实施。一般来说,我会建议您广泛使用众所周知的设计模式,例如Abstract Factory,Bridge,Facade等。
作为一个例子,首先要确定与平台相关的每一段代码,定义负责处理核心项目中这些特性的API接口,并将它们实现到专用项目中 - 通常每个平台一个。完成后,返回到您的核心项目并定义一个接口,该接口将包含实例化这些特定类的工厂方法。再次在各自的项目中实施特定的工厂。
此时,您可以通过选择将实例化您的类的工厂,在运行时决定您要使用哪个后端。下一步是提供一些可插拔的系统来在运行时加载所需的工厂,这要归功于这部分可能是最简单的反射。您浏览特殊文件夹中包含的每个程序集,分析它们的类型以检测它们是否实现了工厂接口,如果它们执行:加载它们。
答案 2 :(得分:0)
作为一般经验法则,将项目保持在小巧简洁的解决方案中;理想情况下,平台相关位应完全在单独的项目中实现。您可能希望查看软件创建设计方法(如抽象工厂模式),以保持特定于平台的依赖关系,集中并进行检查。
在抽象层面上,监控开发的一种方法是使用Team Foundation Server(TFS)。它基本上为Visual Studio开发提供了git功能,因此您可以轻松跟踪csproj。如果您有一个团队通过Eclipse从事Java或Android等工作,您可以通过TFS插件使用TFS,让每个人都在同一页面上,并跟踪项目和整体解决方案中的变化和修订。
通常,具有潜在多平台实施的项目从构思和规划阶段开始就是这样构建的。如果您遇到了现在想要移植的项目,可以使用您建议的前两个选项,如果区分程序集是个问题,那么有多个第三方反编译器可以为您完成这项工作。
希望有所帮助。