Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于同时支持Mac和Windows桌面的建议_Windows_Macos_Cross Platform_Desktop Application - Fatal编程技术网

关于同时支持Mac和Windows桌面的建议

关于同时支持Mac和Windows桌面的建议,windows,macos,cross-platform,desktop-application,Windows,Macos,Cross Platform,Desktop Application,构建同时支持Windows和OS X的GUI桌面应用程序的最佳实践是什么?假设它是预算软件,所以有一些数学和一些大数据结构。用户数据保存在XML文件中;没有单独的数据库或网络 在一个极端情况下,您可以只在C#中构建Windows版本,在Objective C中构建Mac版本。有没有更好的方法,使您可以更轻松地保持两个版本的同步,并编写更少的重复代码?你会在C++中编写数学和数据结构和“业务逻辑”,用预处理器指令来调用简单的系统调用,比如IO,然后为Windows编写一个单独的GUI层,一次用于O

构建同时支持Windows和OS X的GUI桌面应用程序的最佳实践是什么?假设它是预算软件,所以有一些数学和一些大数据结构。用户数据保存在XML文件中;没有单独的数据库或网络

在一个极端情况下,您可以只在C#中构建Windows版本,在Objective C中构建Mac版本。有没有更好的方法,使您可以更轻松地保持两个版本的同步,并编写更少的重复代码?你会在C++中编写数学和数据结构和“业务逻辑”,用预处理器指令来调用简单的系统调用,比如IO,然后为Windows编写一个单独的GUI层,一次用于OS X?假设您需要本机代码,C/C++是跨平台后端的唯一选择吗?有没有办法一次编写GUI部分?(我想不会。)


请注意,我不是在问如何使用交叉编译器。我感兴趣的是你如何以最少的麻烦来构建你的整个项目。

你看过吗?它允许您在.Net中开发,但可以跨平台部署。

您基本上是正确的。您可以用C/C++编写数据模型,用C#/.NET和Objective-C/Cocoa编写UI

我不熟悉C是如何与非C代码对话的,但是Objy-C(C上构建的)将很容易与C和C++(后者与Objul-C++)对话。如果您愿意将Python和/或Ruby与Objective-C代码和Cocoa框架一起用于跨平台部分,也可以使用它们


我赞扬您超越了Java或其他跨平台UI的简单解决方案。如果您选择本机方式,您将拥有一款外观更好、更易于使用的产品。

鉴于我对平台本机用户界面和控件/小部件的强烈感受,我很可能对这个问题有不同的看法,但我更倾向于您的第二种方式。即使是我也没有受虐狂到足以承受单独构建整个应用程序的麻烦

因此,我肯定会编写完全独立于GUI层的库或数据层代码。在C++中做这是一个明显的选择,尤其是如果你已经习惯了这种语言,但以后会更多。关键是,此代码应仅限于您的“业务逻辑”,因此完全独立于平台。如果遵循坚实的面向对象原则,那么大部分编程工作都是在这个级别上完成的

另外,您将在Windows和OS X的核心OS和UI函数上编写一个精简的“包装器”库。包装器库将是负责直接与平台交互的唯一实体,您的数据层代码应调用此包装器库中的函数,而不是直接从平台的API

当然,你们中的一些人读到这篇文章时可能会尖叫“但这就是QT已经为你们做的!”是的,我知道。但它不使用本机小部件,并且在许多地方不符合标准平台约定。这意味着它很糟糕。我见过其他Windows的包装器库确实做到了这一点,但我还没有在OSX上看到一个看起来有点像样的包装器库。是的,我很挑剔,但你典型的Mac用户也是如此。他们不会容忍Windows用户会容忍的那种屏幕上的垃圾,连Mac Office团队都知道这一点。(我们都为你努力做到这一点而鼓掌。)


至于您选择的语言,您说您正在两种平台上寻找本机代码。那是一团很难粘在墙上的果冻。例如,您认为JIT遵从的代码是原生的吗?如果不是,那就排除C。排除任何类型的解释代码都会排除许多其他潜在的语言。除了C++和ObjaveC,你没有很多选择,但是C++和Win32编程并没有比可可编程更困难,只是不同。

也许可以看看跨平台框架,比如Qt。谢谢你的建议,但是我不想用大框架来屏蔽安装。否则我会使用Java。@Paul:请注意,在Windows机器上安装C#/.NET时,它仍然需要一个框架。是的,很多计算机可能已经安装了这个,但肯定不是全部。您对安装基础的依赖程度取决于您所针对的.NET Framework版本。你不能假设每个人都会安装最新版本;它甚至还没有包含在Windows版本中。如果你的目标是完全避免使用框架(就像我在回答中提到的,严格遵守本机代码),那么你也必须在PC端避免使用C。@Cody,请参阅我对你答案的评论:我计划使用一个非常旧的.Net,所以它应该在那里。从C应用程序调用C/C++dll并不是太糟糕。如果我让DLL“被管理”,它会更干净,但是我怀疑这会污染C++代码,所以很难编译它。(我不积极,我没有管理C++的经验。)我同意你的审美判断,重新GUI平台,以及你对Mac用户的评估。对我来说,Windows上的C和OC上的Obj-C都是“原生”的(我的目标是一个非常旧的.NET版本)。我不希望共享代码带来一个大的框架安装。@保罗:那么值得注意的是,C++代码的C++互操作真的不是那么难。但是我认为编写一个包装器LIB调用本地原语API(即使在Windows上,而不是C语言,你也可以在C++中做,因为.NETFramework提供它自己的GUI库)仍然比在两个平台上完全重新创建GUI更容易。当然,如果您确实决定在两个平台上设计单独的GUI,那么您将拥有更大的灵活性。你可能希望你的应用程序看起来像Mac上的iTunes和Windows上的Microsoft Word