使用C#,.NET Core 3和GTK#进行跨平台编程(以及替代方案)

6
我即将开始开发一个软件项目,该项目应在Linux和Windows上运行(如果可能的话)。由于我已经有一些C#的经验,所以我很想在这个项目中使用它。我认为使用.NET Core 3和GTK# 3.22应该不会有问题,因为.NET Core App应该是跨平台的。据我了解,只要在同一版本下可用,GTK#应该能够在任何地方工作。

为什么选择C#?嗯,我喜欢这种语言,并且有一个适用于C#的ECS框架,我想使用它。

到目前为止,我在Visual Studio中设置了一个测试控制台应用程序项目,针对.NET Core 3,并添加了一个GTK#特定的NuGet包

我编写了一个简单的“Hello World”程序来测试环境。

using System;
using Gtk;

namespace GTKTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Application.Init();
            Window win = new Window("Hello GTK");
            Label lbl = new Label("This is a test GTK App written with C# for GNU/Linux and Windows");
            win.DeleteEvent += Win_DeleteEvent;
            win.Add(lbl);
            win.ShowAll();
            Application.Run();
            win.Dispose();
            Console.Write("Press any key...");
            Console.ReadKey();
        }

        private static void Win_DeleteEvent(object o, DeleteEventArgs args)
        {
            Application.Quit();
            args.RetVal = true;
        }

    }
}

当我从Visual Studio 2019运行此代码时,我会得到
System.TypeInitializationException
  HResult=0x80131534
  Message=The type initializer for 'Gtk.Application' threw an exception.
  Source=GtkSharp
  StackTrace:
   at Gtk.Application.Init()
   at GTKTest.Program.Main(String[] args) in D:\Workspace\VSRepos\C#\GTKTest\Program.cs:line 10

Inner Exception 1:
DllNotFoundException: Gtk

在寻找解决方案时,我安装了mono和此页面上的Windows GTK#。如果我坚持使用.NET Core,mono部分应该是不必要的。

我缺少什么?我做错了什么?像我想象的那样实现这一点是否可能?我还对如何使用C#编写跨平台GUI软件的一些替代方法感兴趣。我偶然发现了electron.js,但我听说它有一些很大的内存开销,而且我不太擅长javascript。AvaloniaUI听起来很有趣,但我认为上述方法会更好。

编辑:在添加msys路径后,如此处第3步骤中所建议,我得到了上面异常之前的以下错误。该错误说明在dll中找不到过程入口点。

enter image description here


错误信息告诉您它找不到 Gtk dll,因此缺失。 您是否按照 Gtk 安装指南的第3步进行操作? 此外,这里有一些替代方案:Electron.NET 至少后端是 C#,Electron.NET 带有 Blazor 前端 完全使用 WebAssembly 的 C#,以及Xamarin.Forms 现在支持 Linux - MindSwipe
1
这里是关于在Electron应用程序中使用Blazor的另一个绝佳资源。 - MindSwipe
@MindSwipe 在按照您提到的第三步操作后,我现在遇到了一个额外的错误。请参见编辑后的问题。 - patvax
2
GTK#安装程序适用于.NET标准,它安装了GTK库并在GAC中注册它们。我还没有尝试过在.NET Core 3上使用GTK#;它肯定可以在Windows的.NET经典版本和跨Windows/Mac/Linux的Mono上运行。如果.NET Core 3可以加载这些程序集,我认为它们需要在您的应用程序根目录中。个人而言,在将我的GTK#从Mono/.NET 4.8移植之前,我正在等待.NET 5的发布。 - muszeo
1个回答

2
我知道这是一个老问题,但Google很喜欢它。我遇到了类似的问题。有很多易于搜索但难以让它们起作用的指南。以下是在2022年4月帮助我的指南
第1步:安装MSYS2 下载MSYS2安装程序并按照安装说明进行操作。
第2步:安装GTK+3 打开MSYS2 shell,并运行:pacman -S mingw-w64-x86_64-gtk3 第3步:修改PATH变量,以便找到库。
Open up Control Panel
Go to System and Security > System
Click on the Advanced system settings link
Click on Environment Variables... button
Under System variables find the Path variable and select it
Click the Edit button
Add either ;C:\msys64\mingw64\bin or ;C:\msys32\mingw32\bin to the end of the variable, depending on your system architecture
Click OK, and you are done
Restart your system for the changes to apply

要运行GtkSharp示例项目,您还需要:

pacman -S mingw-w64-x86_64-gtksourceview4

否则会抛出以下异常:...System.DllNotFoundException: GtkSource: libgtksourceview-4-0.dll...

然后您可以从这里或Nuget安装GtkSharp。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接