运行 2015 年 Linux 的 .NET 应用程序
Running a .NET app in Linux in 2015
TL;DR : 现在 运行 Linux 上的 VS2015 解决方案有哪些选择?
我有一个 .NET 应用程序 运行 在 Windows 中运行良好,并且已收到将其移植到 Linux 的请求。我一直在努力理解它在 2015 年的今天意味着什么,但我真的很困惑所有指向 Mono 的旧帖子和谈论 vNext 的新帖子(仍然提到 Mono)。此外,我对 .NET 有很好的背景,但我对 Linux 了解不多...
我遵循了最近的教程并设法在 Linux 中编译并 运行 一个 Hello World 控制台应用程序。这需要安装一些我不知道的东西,包括 Mono,然后 运行ning 一些 "k" 命令(kpm restore、kpm build、k 运行)。但是现在我不知道如何继续我的真实案例场景。
我有一个 VS2015 解决方案,它有很多项目,但这里只有 4 个值得一提:
- 常见的东西
- 服务核心
- 服务Windows/服务控制台
所有代码都在 ServiceCore 项目(class 库)中,它本身引用了 CommonStuff(另一个 class 库)。 ServiceWindows 是一个 Windows 服务项目,它简单地调用 ServiceCore 的 Main 函数,ServiceConsole 做同样的事情但是在控制台应用程序中(出于调试原因,因为无法调试 Windows 服务项目来自 Visual Studio).
CommonStuff 和 ServiceCore 都包含大量 .NET 库以及一些第 3 方 dll。然而,没有 Windows 特定代码,没有 pinvoke 或时髦的东西。
如果我们考虑将 ServiceConsole 变成我想要 运行 Linux 的应用程序 - 我需要做什么才能实现它?编译 Hello World 是一回事,但现在,有了所有这些参考……我不知道从哪里开始。另外,我什至不能在 Linux 中编译代码(专有代码)所以我需要在 Windows 中编译代码并且编译后的 dll/exe 是 运行 直接在 Linux - 这是可能的吗?我看到一些帖子说 Mono 可以 运行 编译应用程序,但是我看到的每一个 Mono turorial 都是从编译开始的。我也不确定这个 vNext 是什么。我阅读了有关 Linux 中 运行 代码的能力的内容,如果它是针对 .net 6 的...但我不知道它是如何或意味着什么。
如果有人能花点时间详细解释一下现在的选项是什么,以及它是否适用于专业应用程序,或者它是否仅适用于 Hello Worlds,我将不胜感激。
谢谢
编辑:好的,看来我可以在 VS 中编译我的代码,并以某种方式在 Linux 上使用 Mono 运行 它 - 如何?
我经常在 windows 上使用 Visual Studio 2015 开发多平台或仅 linux 的复杂应用程序。您可以在 VS 中编译它,复制到 linux 和 运行 - 几乎总是这样就可以了。如果您进行认真的开发,您 可能 想要在单声道下编译以发现一些缺失的方法\不同的签名,但这不是 必需的 。
现在,windows 服务可以更改为控制台应用程序。基本上它只是由外部工具管理的控制台应用程序。在 linux 上,有不同的工具可让您管理(启动\停止\失败时重新启动等)您的 "service" 应用程序。
对于 Web 应用程序,我通常使用 ServiceStack,它 运行 在单声道上没有问题。您甚至可以在 nginx 后面将其作为控制台应用程序再次自行托管。您还可以在 apache\nginx 下托管 asp.net 应用程序,只需很少或无需更改代码。
半年前我从windows服务器到CentOS 7服务器开发了2年的"ported"大项目,主要是把东西复制到centos和运行ning(几乎没有变化,无需在单声道下重新编译)。当然,该项目有很多第三方依赖项,而这些依赖项的一些开发人员甚至不知道 mono 的存在。尽管如此,他们还是奏效了。该解决方案有大约 90 个 VS 项目。
当然,并不是每个复杂的项目都那么容易移植,尤其是如果您经常使用本机库,但通常情况并非如此。此外,如果您使用 sql 服务器,请注意根据我的经验,单声道中的 sql 服务器驱动程序非常糟糕。如果可以选择,我会使用 postgre 并避免使用 sql 服务器和单声道。在单声道中处理图像也不是很好,有错误且不稳定。我不惜一切代价避免在那里使用 Bitmap class,而是 pinvoke 到 imagemagick C api。但是只有当你进行认真和广泛的成像时你才需要在那里做,对于基本任务来说没问题。
长话短说 - 运行在 2015 年 Linux 中安装 .NET 应用程序现在不是问题。
更新。如果你已经在 2018 年了——几乎没有理由在 linux 上使用单声道,除了使用 Xamarin 进行移动应用程序开发、使用 Unity 进行游戏开发或 UI 应用程序等特定情况。如果您只需要常规 console\service 应用程序(包括 Web 服务器)- 使用 .NET Core。它已经足够稳定和快速用于生产,而且根据我的经验 - 已经比 mono 的错误少得多。在大多数情况下,将完整的 .NET\mono 应用程序移植到 .NET Core 相对简单,但某些库可能在新平台上尚不可用。但是,如果您正在开始新项目 - 毫无疑问,请选择 .NET Core。
TL;DR : 现在 运行 Linux 上的 VS2015 解决方案有哪些选择?
我有一个 .NET 应用程序 运行 在 Windows 中运行良好,并且已收到将其移植到 Linux 的请求。我一直在努力理解它在 2015 年的今天意味着什么,但我真的很困惑所有指向 Mono 的旧帖子和谈论 vNext 的新帖子(仍然提到 Mono)。此外,我对 .NET 有很好的背景,但我对 Linux 了解不多...
我遵循了最近的教程并设法在 Linux 中编译并 运行 一个 Hello World 控制台应用程序。这需要安装一些我不知道的东西,包括 Mono,然后 运行ning 一些 "k" 命令(kpm restore、kpm build、k 运行)。但是现在我不知道如何继续我的真实案例场景。
我有一个 VS2015 解决方案,它有很多项目,但这里只有 4 个值得一提: - 常见的东西 - 服务核心 - 服务Windows/服务控制台
所有代码都在 ServiceCore 项目(class 库)中,它本身引用了 CommonStuff(另一个 class 库)。 ServiceWindows 是一个 Windows 服务项目,它简单地调用 ServiceCore 的 Main 函数,ServiceConsole 做同样的事情但是在控制台应用程序中(出于调试原因,因为无法调试 Windows 服务项目来自 Visual Studio).
CommonStuff 和 ServiceCore 都包含大量 .NET 库以及一些第 3 方 dll。然而,没有 Windows 特定代码,没有 pinvoke 或时髦的东西。
如果我们考虑将 ServiceConsole 变成我想要 运行 Linux 的应用程序 - 我需要做什么才能实现它?编译 Hello World 是一回事,但现在,有了所有这些参考……我不知道从哪里开始。另外,我什至不能在 Linux 中编译代码(专有代码)所以我需要在 Windows 中编译代码并且编译后的 dll/exe 是 运行 直接在 Linux - 这是可能的吗?我看到一些帖子说 Mono 可以 运行 编译应用程序,但是我看到的每一个 Mono turorial 都是从编译开始的。我也不确定这个 vNext 是什么。我阅读了有关 Linux 中 运行 代码的能力的内容,如果它是针对 .net 6 的...但我不知道它是如何或意味着什么。
如果有人能花点时间详细解释一下现在的选项是什么,以及它是否适用于专业应用程序,或者它是否仅适用于 Hello Worlds,我将不胜感激。
谢谢
编辑:好的,看来我可以在 VS 中编译我的代码,并以某种方式在 Linux 上使用 Mono 运行 它 - 如何?
我经常在 windows 上使用 Visual Studio 2015 开发多平台或仅 linux 的复杂应用程序。您可以在 VS 中编译它,复制到 linux 和 运行 - 几乎总是这样就可以了。如果您进行认真的开发,您 可能 想要在单声道下编译以发现一些缺失的方法\不同的签名,但这不是 必需的 。
现在,windows 服务可以更改为控制台应用程序。基本上它只是由外部工具管理的控制台应用程序。在 linux 上,有不同的工具可让您管理(启动\停止\失败时重新启动等)您的 "service" 应用程序。
对于 Web 应用程序,我通常使用 ServiceStack,它 运行 在单声道上没有问题。您甚至可以在 nginx 后面将其作为控制台应用程序再次自行托管。您还可以在 apache\nginx 下托管 asp.net 应用程序,只需很少或无需更改代码。
半年前我从windows服务器到CentOS 7服务器开发了2年的"ported"大项目,主要是把东西复制到centos和运行ning(几乎没有变化,无需在单声道下重新编译)。当然,该项目有很多第三方依赖项,而这些依赖项的一些开发人员甚至不知道 mono 的存在。尽管如此,他们还是奏效了。该解决方案有大约 90 个 VS 项目。
当然,并不是每个复杂的项目都那么容易移植,尤其是如果您经常使用本机库,但通常情况并非如此。此外,如果您使用 sql 服务器,请注意根据我的经验,单声道中的 sql 服务器驱动程序非常糟糕。如果可以选择,我会使用 postgre 并避免使用 sql 服务器和单声道。在单声道中处理图像也不是很好,有错误且不稳定。我不惜一切代价避免在那里使用 Bitmap class,而是 pinvoke 到 imagemagick C api。但是只有当你进行认真和广泛的成像时你才需要在那里做,对于基本任务来说没问题。
长话短说 - 运行在 2015 年 Linux 中安装 .NET 应用程序现在不是问题。
更新。如果你已经在 2018 年了——几乎没有理由在 linux 上使用单声道,除了使用 Xamarin 进行移动应用程序开发、使用 Unity 进行游戏开发或 UI 应用程序等特定情况。如果您只需要常规 console\service 应用程序(包括 Web 服务器)- 使用 .NET Core。它已经足够稳定和快速用于生产,而且根据我的经验 - 已经比 mono 的错误少得多。在大多数情况下,将完整的 .NET\mono 应用程序移植到 .NET Core 相对简单,但某些库可能在新平台上尚不可用。但是,如果您正在开始新项目 - 毫无疑问,请选择 .NET Core。