移植C#代码以在OSX上运行

移植C#代码以在OSX上运行,c#,.net,macos,mono,C#,.net,Macos,Mono,我们有一个在.NET3.5中运行的控制台应用程序。它连接到一个USB设备,并吐出从中接收到的数据 我想把它移植到OSX,并对实现这一点的策略提出一些问题。USB驱动程序已安装在OSX上 Mono看起来很有前途,但我不明白。最终用户是否必须安装Mono或运行某些程序 在看了其他一些帖子之后,你似乎可以编写一个bash脚本并进行一些黑客操作来安装程序……但是我找不到一个很好的解释。在这个过程中似乎也不会安装mono。这些帖子也是从09年开始的,所以我想知道是不是有什么变化让这变得更容易了 我的问题是

我们有一个在.NET3.5中运行的控制台应用程序。它连接到一个USB设备,并吐出从中接收到的数据

我想把它移植到OSX,并对实现这一点的策略提出一些问题。USB驱动程序已安装在OSX上

Mono看起来很有前途,但我不明白。最终用户是否必须安装Mono或运行某些程序

在看了其他一些帖子之后,你似乎可以编写一个bash脚本并进行一些黑客操作来安装程序……但是我找不到一个很好的解释。在这个过程中似乎也不会安装mono。这些帖子也是从09年开始的,所以我想知道是不是有什么变化让这变得更容易了


我的问题是,运行/移植C#console应用程序到OSX的好方法是什么。

.NET在包括windows平台在内的所有平台上都编译为IDL(字节码)。然后,它在CLR(公共语言运行库iirc)上运行,这是一个类似于Java虚拟机的概念。碰巧在大多数Windows计算机上,默认情况下安装了此CLR。因此,如果希望应用程序在另一个平台上运行,首先需要该平台的CLR。Mono确实包含一个可以在OSX上运行的CLR。因此,在运行.NET之前,您(作为包/捆绑包的一部分)或用户需要安装它

另一个问题是.NET还包含某些API,这些API不是ECMA标准的一部分,您的应用程序可能会使用,也可能不会使用。有些API在mono中存在,有些则不存在。那些通常没有的应用程序通常有一个等价或类似的API,您可以使用它来实现相同的功能,但是您可能需要修改应用程序来处理该场景

这实际上取决于您的应用程序使用的.NETAPI以及移植的难度。我猜您可能正在使用winforms作为应用程序的一部分,因此下面是mono站点提供的API部分指南


您可以将Mono安装程序与您的应用程序(或您自己的Mono版本)捆绑在一起。您甚至可以选择将mono运行时静态链接到Mac上的应用程序中,我不记得它是否受支持。我很肯定你能

另外,请注意gordatron的警告,如果使用Path.Combine()创建路径而不是硬编码\作为路径分隔符(无论如何都应该这样做),则不必担心文件系统路径问题

为了方便地检查您的应用程序是否使用了Mono中不可用的任何功能,您可以使用来检查不受支持的方法/类以及任何其他潜在的非跨平台阻止程序,如p/Invokes

对于控制台应用程序,我不认为您会遇到很多问题(尽管您可能需要与Windows中的USB硬件进行不同的接口)。

c#在执行IL(c#编译到的内容)的.net运行时上运行,无论.net代码在何处运行,您都需要运行时。mono是OSX的.net运行时,它可能会工作,但从我玩过的小游戏来看,像\being/on*nix这样的操作系统只是为了访问文件而必须处理的事情。我认为你可能会有更多的问题,这取决于你的程序所做的。如果设计得当,您可能能够将“更高级别”的类转换为java,并且只需重新写入文件访问,但这仍然需要安装JVM。