Dot-Net

2015 年在 Linux 中執行 .NET 應用程序

  • May 25, 2018

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 庫以及一些 3rd 方 dll。然而,沒有 Windows 特定的程式碼,沒有 pinvoke 或時髦的東西。

如果我們認為 ServiceConsole 成為我想在 Linux 上執行的應用程序 - 我需要做些什麼來實現它?編譯 Hello World 是一回事,但現在,有了所有這些參考資料……我不知道從哪裡開始。另外,我什至無法在 Linux 中編譯程式碼(專有程式碼),所以我需要在 Windows 中編譯程式碼,並且編譯後的 dll/exe 可以直接在 Linux 中執行——這可能嗎?我看過一些文章說 Mono 可以執行已編譯的應用程序,但我看到的每一個 Mono 教程都是從編譯開始的。我也不確定這個 vNext 是什麼。如果它針對.net 6,我閱讀了有關在 Linux 中執行程式碼的能力的東西……但我不知道它是如何或意味著什麼。

如果有人能花一些時間詳細解釋一下現在有哪些選項,以及它對於專業應用程序是否現實,或者它是否只對 Hello Worlds 有用,我將不勝感激。

謝謝

編輯:好的,看來我可以在 VS 中編譯我的程式碼,並以某種方式使用 Mono 在 Linux 上執行它 - 怎麼樣?

我經常在 Windows 上使用 Visual Studio 2015 開發多平台或僅限 linux 的複雜應用程序。您可以在 VS 中編譯它,複製到 linux 並執行 - 幾乎總是這樣就可以了。如果您進行認真的開發,您可能希望在單聲道下編譯以發現一些缺失的方法\不同的簽名,但這不是必需的。

現在,可以將 Windows 服務更改為僅控制台應用程序。基本上它只是由外部工具管理的控制台應用程序。在 linux 上有不同的工具可以讓你管理(啟動\停止\失敗重啟等等)你的“服務”應用程序。

對於 Web 應用程序,我通常使用 ServiceStack,它在單聲道上執行沒有問題。您甚至可以在 nginx 後面再次將其作為控制台應用程序自行託管。您還可以在 apache\nginx 下託管 asp.net 應用程序,只需很少或無需更改程式碼。

半年前,我將開發了 2 年的大型項目從 windows 伺服器“移植”到 CentOS 7 伺服器,主要是通過將內容複製到 centos 並執行(幾乎沒有什麼變化,沒有在 mono 下重新編譯)。當然,該項目有許多第三方依賴項,這些依賴項的一些開發人員甚至不知道 Mono 的存在。然而,他們只是工作。該解決方案有大約 90 個 VS 項目。

當然,並不是每個複雜的項目都那麼容易移植,尤其是如果您經常使用原生庫,但通常情況並非如此。此外,如果您使用 sql server,請注意,根據我的經驗,單聲道中的 sql server 驅動程序非常糟糕。如果可以選擇,我會使用 postgre 並避免使用帶有 mono 的 sql server。以單聲道處理圖像也不是很好,有問題且不穩定。我不惜一切代價避免在那裡使用 Bitmap 類,而是使用 imagemagick C api。但是只有在進行認真而廣泛的成像時才需要這樣做,對於基本任務來說就可以了。

長話短說——2015 年在 Linux 中執行 .NET 應用程序現在已經不是問題了。

更新。如果您已經是 2018 年了 - 除了使用 Xamarin 進行移動應用程序開發、使用 Unity 進行遊戲開發或 UI 應用程序等特定情況之外,幾乎沒有理由在 linux 上使用 mono。如果您只需要正常的控制台\服務應用程序(包括 Web 伺服器)- 使用 .NET Core。它已經足夠穩定且足夠快,可以用於生產,而且根據我的經驗 - 已經比單聲道少得多。在大多數情況下,將完整的 .NET\mono 應用程序移植到 .NET Core 相對簡單,儘管某些庫可能還沒有在新平台上可用。但是,如果您正在開始新項目 - 毫無疑問選擇 .NET Core。

引用自:https://stackoverflow.com/questions/32655736