2015年在Linux中运行.NET应用程序

时间:2015-09-18 15:27:05

标签: .net linux mono

TL; DR:现在在Linux上运行VS2015解决方案有哪些选择?

我有一个在Windows中运行良好的.NET应用程序,并且已收到将其移植到Linux的请求。我一直在努力去理解今天它在2015年意味着什么,但我真的很困惑所有指向Mono的旧帖子以及关于vNext的新帖子(并且仍然提到Mono)。我也有一个很好的.NET背景,但我对Linux一般都不太了解......

我遵循了最近的教程并设法在Linux中编译并运行Hello World控制台应用程序。这需要安装一些我不知道的东西,包括Mono,然后运行一些" k"命令(kpm restore,kpm build,k run)。但是现在我不知道如何继续我的真实情况。

我有一个VS2015解决方案,它有很多项目,但这里只有4个值得一提:   - CommonStuff   - ServiceCore   - ServiceWindows / ServiceConsole

所有代码都在ServiceCore项目(类库)中,它本身具有对CommonStuff(另一个类库)的引用。 ServiceWindows是一个Windows服务项目,只调用ServiceCore的Main函数,ServiceConsole在控制台应用程序中执行相同的操作(出于调试原因,因为它无法从Visual Studio调试Windows服务项目)。

CommonStuff和ServiceCore都包含许多.NET库以及一些第三方dll。但是没有特定于Windows的代码,没有pinvoke或时髦的东西。

如果我们认为ServiceConsole成为我想在Linux上运行的应用程序 - 我需要做些什么来实现它?编译Hello World是一回事,但是现在,所有的参考文献......我都不知道从哪里开始。此外,我甚至无法在Linux(专有代码)中编译代码,因此我需要在Windows中编译代码,并且编译后的dll / exe直接在Linux中运行 - 这是可能的?我看过一些帖子说Mono可以运行已编译的应用程序,但我看到的每一个Mono turorial都是从编译开始的。此外,我不确定这个vNext是什么。我读过关于在Linux中运行代码的能力,如果它针对的是.net 6 ......但我不知道它是如何或意味着什么。

如果有人花些时间详细解释一下现在的选项是什么,以及它对于专业应用程序是否真实,或者它是否只对Hello Worlds有益,我将不胜感激。< / p>

由于

编辑:好的,好像我可以在VS中编译我的代码并以某种方式在Linux上使用Mono运行它 - 如何?

1 个答案:

答案 0 :(得分:16)

我经常使用Windows上的Visual Studio 2015开发多平台或仅限Linux的复杂应用程序。你可以在VS中编译它,复制到linux并运行 - 几乎总是这样才能工作。如果您进行了认真的开发,可能想要在mono下编译以发现一些丢失的方法\不同的签名,但这不是 required

现在,Windows服务可以更改为仅控制台应用程序。基本上它只是由外部工具管理的控制台应用程序。在Linux上有不同的工具,允许您管理(启动\停止\重启失败等)你的“服务”应用程序。

对于Web应用程序,我通常使用ServiceStack,它在单声道上运行没有问题。您甚至可以将其作为控制台应用程序再次自我托管,位于nginx之后。您还可以在apache \ nginx下托管asp.net应用程序,几乎不需要更改代码。

半年前,我“移植”了从Windows服务器到CentOS 7服务器开发了两年的大项目,主要是将内容复制到centos并运行(只需很少的更改,无需在单声道下重新编译)。当然,该项目有许多第三方依赖项,而这些依赖项的一些开发人员甚至不知道单元存在。然而他们只是工作。该解决方案有大约90个VS项目。

当然,并非每个复杂项目都很容易移植,特别是如果您经常使用本机库,但通常情况并非如此。另外,如果你使用sql server,请注意单声道的sql server驱动程序从我的经验来看是非常糟糕的。如果我有选择的话,我使用postgre并避免单声道sql server。使用单声道图像也不是很好,有缺陷和不稳定。我不惜一切代价避免使用Bitmap类,而是转而使用imagemagick C api。但是,只有在你进行严肃而广泛的成像时才需要做到这一点,对于基本任务来说,这很好。

长话短说 - 2015年在Linux上运行.NET应用程序现在不是问题。

更新。如果你已经在2018年了 - 几乎没有理由在Linux上使用mono,除了特殊情况,比如使用Xamarin进行移动应用程序开发,使用Unity进行游戏开发,或者使用UI应用程序。如果您只需要常规的console \ service应用程序(包括Web服务器) - 请使用.NET Core。它已经足够稳定和快速用于生产用途,而且从我的经验来看 - 已经比单声道更少的马车了。在大多数情况下,将完整的.NET \ mono应用程序移植到.NET Core相对简单,尽管某些库可能尚未在新平台上可用。但是如果你正在开始新项目 - 毫无疑问选择.NET Core。