在 ReactOS 上入门 C#





5.00/5 (14投票s)
如何在 ReactOS 中编译和运行第一个 C# 应用程序
引言
ReactOS 是 Windows 操作系统的一个开源替代品。尽管 ReactOS 的第一个版本可以追溯到 1998 年,但至今仍未发布“稳定”版本。也许最重要的原因是对它的关注度不够。
我想介绍如何在当前版本 0.4.7 中编译和运行第一个非常简单的 C# 应用程序。
- 更新 2018 年 7 月 - ReactOS 版本 0.4.8:该版本自 2018 年 5 月发布,此处也将进行讨论。
- 更新 2018 年 11 月 - ReactOS 版本 0.4.9:该版本自 2018 年 7 月发布,此处也将进行讨论。
- 更新 2019 年 2 月 - ReactOS 版本 0.4.10:该版本自 2018 年 11 月发布,此处也将进行讨论。
我在 ORACLE VM VirtualBox 5.1.26 和 VMWare Workstation Player 12.5.8 上运行 ReactOS,并强烈推荐使用 VirtualBox - ReactOS 在 VirtualBox 上运行更稳定。
- 更新 2018 年 7 月 - ReactOS 版本 0.4.8:此后我使用 ORACLE VM VirtualBox 5.2.12。
- 更新 2018 年 11 月 - ReactOS 版本 0.4.9:此后我使用 ORACLE VM VirtualBox 5.2.26。
虚拟机已创建,拥有 2048 MB 内存和 25 GB 硬盘。默认网络适配器“Intel PRO/1000 MT Desktop (8254OEM)”必须更改为“PC-net PCI II (Am79C970A)”才能正常工作。
我首先安装的是 Firefox 45.0.1 或 48.0.2(可以从 ReactOS 应用程序管理器安装)。安装完成后,我立即打开 [≡]|[选项],并将 [搜索]|[搜索引擎] 更改为“DuckDuckGo”(我个人偏爱无监督搜索,并获取非搜索引擎提供商偏好排序的结果),同时将 [高级]|[更新] 中的“自动...”设置为“从不...” (因为较新的 Firefox 版本,例如 52.0.1esr,在 ReactOS 上无法启动)。
背景
不幸的是,.NET Framework 1.1(即使它在 ReactOS 的“应用程序管理器”中是官方支持的安装项)和 .NET 2.0 SDK 的安装都失败了。
- 更新 2018 年 7 月 - ReactOS 版本 0.4.8:.NET Framework 1.1 安装期间出现额外的消息。
.NET Framework 2.0 安装期间也出现了额外的消息。
- 更新 2018 年 7 月 - ReactOS 版本 0.4.9:...和...
- 更新 2018 年 11 月 - ReactOS 版本 0.4.9:ReactOS 版本 0.4.8 在安装 .NET Framework 1.1 时的额外消息在 ReactOS 版本 0.4.9 中不再出现,但安装仍然不成功。
.NET 2.0 经历了完整的设置过程,没有任何错误消息或警告。但是,即使是最简单的 C# 应用程序的编译也会因为“fatal error CVT1103
”而失败,这与旧版本的 ReactOS 一样。
这阻止了安装基于 .NET 1.1 或 2.0 的 IDE(SharpDevelop 1.1 或 2.2,Visual Studio 2003 或 2005 等)。
在尝试安装 .NET Framework 的许多次尝试中,有两个安装成功通过了完整的设置过程,没有任何错误消息或警告。
- .NET Framework 2.0 SP2 可再发行版 32 位(NetFx20SP2_x86.exe 24,416kB)
- .NET Framework 4.0 可再发行版 32 位(dotNetFx40_Full_x86_x64.exe 49,268kB)
尽管安装成功,但即使是最简单的 C# 应用程序的编译仍然会因为“fatal error CVT1103”而失败(源代码请参阅文章底部的“使用代码”部分)。尽管如此,.NET 4.0 Runtime 仍然可用,并且我们需要它来执行以下操作。
幸运的是,这种(无法编译 C# 代码的)限制情况有一个解决办法:MONO。
ReactOS 版本 0.4.7 和 0.4.8 将自身报告为“ReactOS [版本 5.2.3790] Service pack 2”(相当于 Windows Server 2003)。
最新完全功能的 MONO 版本(一个好的下载来源是download.mono-project.com/archive),可以为 ReactOS 版本 0.4.7 安装的是
- MONO 3.2.3 32 位 Windows 安装程序(mono-3.2.3-gtksharp-2.12.11-win32-0.exe 100,854kB)
此安装报告:Mono JIT 编译器版本 3.3.0(来自 2012 年)
更新的 MONO 版本,安装成功但功能不全,例如
- MONO 3.12.1 32 位 Windows 安装程序(mono-3.12.1-gtksharp-2.12.26-win32-0.msi 130,456kB)
- MONO 4.3.2 32 位 Windows 安装程序(mono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi 130,108kB)
3.2.3 以上的 MONO 版本包含一个无法在 ReactOS 版本 0.4.7 上执行的 MONO 运行时(mono.exe)。所有这些运行时都报告相同的错误:ERROR_BAD_EXE_FORMAT - mono.exe is not a valid Win32 application.
因此,我推荐安装 MONO 3.2.3。由于 MONO 3.2.3 安装在C:\Program Files\Mono-3.2.3,而 3.2.3 以上的 MONO 版本安装在C:\Program Files\Mono,因此 MONO 3.2.3 - 也可以并行安装更新的版本。这提供了根据情况测试更新的程序集的机会。
- 更新 2018 年 7 月 - ReactOS 版本 0.4.8:在 ReactOS 版本 0.4.8 上,我测试过的完全功能的 MONO 版本是
- MONO 3.2.3 32 位 Windows 安装程序(mono-3.2.3-gtksharp-2.12.11-win32-0.exe 100,854kB)
此安装报告:Mono JIT 编译器版本 3.3.0(来自 2012 年) - MONO 3.12.1 32 位 Windows 安装程序(mono-3.12.1-gtksharp-2.12.26-win32-0.msi 130,456kB)
此安装报告:Mono JIT 编译器版本 3.12.1(来自 2014 年) - MONO 4.0.1 32 位 Windows 安装程序(mono-4.0.1-gtksharp-2.12.26-win32-0.msi 118,800kB)
此安装报告:Mono JIT 编译器版本 4.0.1(来自 2014 年) - MONO 4.0.2 32 位 Windows 安装程序(mono-4.0.2-gtksharp-2.12.26-win32-0.msi 118,820kB)
此安装报告:Mono JIT 编译器版本 4.0.2(来自 2014 年) - MONO 4.0.3 32 位 Windows 安装程序(mono-4.0.3-gtksharp-2.12.26-win32-0.msi 117,720kB)
此安装报告:Mono JIT 编译器版本 4.0.3(来自 2014 年)
- MONO 3.2.3 32 位 Windows 安装程序(mono-3.2.3-gtksharp-2.12.11-win32-0.exe 100,854kB)
更新的 MONO 版本,安装成功但功能不全(mcs.exe 编译器可以工作,但 mono.exe 运行时不行),例如
- MONO 4.2.1 32 位 Windows 安装程序(mono-4.2.1.124-gtksharp-2.12.30-win32-0.msi 121,564kB)
- MONO 4.3.2 32 位 Windows 安装程序(mono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi 130,108kB)
4.0.3 以上的 MONO 版本包含一个无法在 ReactOS 版本 0.4.8 上执行的 MONO 运行时(mono.exe)。MONO 版本 4.2.1 和 4.3.2 报告相同的错误:The procedure entry point InitializeConditionVariable could not be located in the dynamic link library KERNEL32.dll.
因此,我推荐安装 MONO 4.0.3。它安装在C:\Program Files\Mono。
- 更新 2018 年 11 月 - ReactOS 版本 0.4.9:...和...
- 更新 2019 年 2 月 - ReactOS 版本 0.4.10:现在,从 MONO 4.2.1 32 位和 MONO 4.3.2 32 位版本安装的mono.exe 运行时工作正常。
因此,我推荐安装 MONO 4.3.2。它安装在C:\Program Files\Mono。
所有我可以推荐的版本(MONO 4.0.3 32 位在 ReactOS 0.4.7/8 上,以及 MONO 4.3.2 32 位在 ReactOS 0.4.9/10 上,它们报告自己为
Environment Version: 4.0.30319.1
甚至比 MONO 4.3.2 更新的版本至少需要 Vista (NT 6.0)。
尽管前面提到的所有设置,直到 MONO 4.0.3 32 位(在 ReactOS 0.4.7/8 上)或 MONO 4.3.2 32 位(在 ReactOS 0.4.9/10 上)都成功通过了完整的设置过程,没有任何错误消息或警告,但它们未能正确安装 Gtk#。
这在一个单独的 Gtk# 安装时变得显而易见。所有gtk-sharp-2.12.xx.msi 设置(一个好的下载来源是www.npackd.org/p/gtksharp,目前提供 gtk-sharp 版本 2.12.20 到 2.12.45)报告相同的错误:The procedure entry point if_nametoindex could not be located in the dynamic link library IPHLPAPI.DLL.(只有gtk-sharp-2.99.3.msi 设置不报告此错误,但它安装的是 Gtk# 3 预览版。)
Gtk# 2.12.9 或更高版本(MonoDevelop-2.8.6.5.msi 所需)的不完整安装阻止了 MonoDevelop 的使用。由于所有专业的 C# IDE(SharpDevelop、Visual Studio、MonoDevelop)都无法在 ReactOS 0.4.7、0.4.8 和 0.4.9 上运行,我退而求其次使用了 Notepad++(版本 6.9 可以从 ReactOS 应用程序管理器安装)。在更新了插件管理器后,可以安装NppExec
插件。
Using the Code
将使用一个非常简单的 C# 应用程序来演示其总体运行能力。
using System;
using System.Reflection;
namespace ConsoleApp01
{
public class ConsoleApp01
{
public static void Main(string[] args)
{
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("Hello from ReactOS on " + Environment.MachineName + "!");
Console.WriteLine("OS Version: " + Environment.OSVersion);
Console.WriteLine("Image runtime Version: " +
Assembly.GetExecutingAssembly().ImageRuntimeVersion.ToString());
Console.WriteLine("Environment Version: " + Environment.Version.ToString());
Console.WriteLine("Setup information: " + AppDomain.CurrentDomain.SetupInformation);
Console.WriteLine("");
Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
}
作为第一步,我建议检查/扩展 `Path` 变量。可以通过开始 | 设置 | 控制面板 | 系统 | 高级 | 环境变量进行编辑,对于 MONO 3.2.3 应包含“;C:\Program Files\Mono-3.2.3\bin;C:\Program Files\GtkSharp\2.12\bin”,对于 MONO 3.12.1 或更高版本应包含“;C:\Program Files\Mono\bin;C:\Program Files\GtkSharp\2.12\bin”。
作为第二步,我建议创建一个工作文件夹C:\Documents and Settings\<user>\My Documents\.NET Apps,一个项目文件夹ConsoleApp01,以及源代码文件ConsoleApp01.cs。
在 Notepad++(已安装NppExec
插件)中,按 [F6] 键会打开命令窗口,可以在其中创建和保存新的命令脚本,以及启动命令脚本。我使用的命令脚本是
NPP_SAVE
CD $(CURRENT_DIRECTORY)
C:\Program Files\Mono\lib\mono\4.5\mcs.exe "$(FILE_NAME)"
- 更新 2018 年 11 月 - ReactOS 版本 0.4.9:编译可能会失败。我遇到了这个错误:
Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'mcs, Version=4.0.3.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. File is corrupt. (Exception from HRESULT: 0x8013110E) ---> System.BadImageFormatException: File is corrupt. (Exception from HRESULT: 0x8013110E)<br /> --- End of inner exception stack trace ---
这表明 MONO 安装失败。在这种情况下,应该卸载 MONO,删除 MONO 安装文件夹(或在删除失败时清理并重命名,如果由于文件系统错误无法删除),然后重新安装 MONO。在我这里,MONO 安装的许多文件要么没有安装,要么文件信息已损坏。我建议以调试模式启动 ReactOS 来修复损坏的文件信息(即使文件未修复,也必须重新安装)。
使用 MONO 运行时执行的生成应用程序会产生此输出。
Hello from ReactOS on REACTOS-047!
OS Version: Microsoft Windows NT 5.2.3790.131072 Service Pack 2
Image runtime Version: v4.0.30319
Environment Version: 4.0.30319.17020
Setup information: System.AppDomainSetup
Press any key to continue...
使用 Microsoft .NET 4.0 运行时执行的生成应用程序会产生此输出。
Hello from ReactOS on REACTOS-047!
OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2
Image runtime Version: v4.0.30319
Environment Version: 4.0.30319.1
Setup information: System.AppDomainSetup
Press any key to continue...
关注点
尽管存在许多陷阱和限制,但在 ReactOS 上编译和运行 .NET 应用程序是可能的。
历史
- 2017 年 12 月 23 日:首次发布。
- 2018 年 1 月 1 日:后续文章:使用 C# 在 ReactOS 上介绍 System.Windows.Forms
- 2018 年 7 月 11 日:更新 1,增加了 ReactOS 0.4.8 的增强功能。
- 2018 年 11 月 23 日:更新 2,增加了 ReactOS 0.4.9 的增强功能。
- 2019 年 2 月 20 日:更新 3,增加了 ReactOS 0.4.10 的增强功能。