11

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

一种方法是解决方案和项目配置。这使我可以排除我不想构建的项目(不幸的是,Visual Studio 并没有让它很容易看到,但无论如何......)。

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

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

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

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

4

3 回答 3

3

您还可以设置文件夹结构并将您的解决方案拆分为包含平台独立项目的通用解决方案和包含平台特定项目的平台特定解决方案。

因此,例如一个包含所有常见项目的 application.sln,为了论证,我们还有一个 iOS 和 Android 解决方案。

  • 根文件夹
    • 应用程序(文件夹)
    • application.Droid(文件夹)
    • 应用程序.Ios(文件夹)
    • 应用程序.sln
    • 应用程序.Droid.sln
    • 应用程序.ios.sln

在特定于平台的解决方案中,您可以通过向特定于平台的项目添加例如带有额外公共项目子文件夹的“[应用程序]”文件夹来引用公共项目。依次添加所有需要的公共文件作为链接。

上面的答案是您还可以的可能性之一:

  • 创建一个在平台特定项目之间共享的可移植类库
  • 使用 MvvmCross ( MvvmCross GitHub ),这样你就有了一个核心项目,你可以在你的平台特定项目中引用它
于 2013-07-02T09:53:43.000 回答
2

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

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

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

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

于 2013-06-11T11:31:20.700 回答
0

作为一般经验法则,将项目保持在一个小而简洁的解决方案中;理想情况下,平台相关位应该完全在单独的项目中实现。您可能希望查看抽象工厂模式等软件创建设计方法,以保持平台特定的依赖性低、集群化和受控。

在抽象级别上,监视开发的一种方法是使用 Team Foundation Server (TFS)。它基本上为 Visual Studio 开发提供了 git 功能,因此您可以轻松跟踪 csproj。如果您有一个通过 Eclipse 开发 Java 或 Android 等的团队,您可以通过 TFS 插件使用 TFS,让每个人都在同一页面上,并跟踪项目和整体解决方案中的更改和修订。

通常,具有潜在多平台实现的项目从构想和规划阶段就以这种方式从头开始构建。如果您现在想移植一个项目,您可以使用您建议的前两个选项,如果区分程序集是一个问题,那么有多个第三方反编译器可以为您完成这项工作。

希望有帮助。

于 2013-06-16T20:14:12.860 回答