创建 OSX 应用程序捆绑包,同时将 Mono 嵌入到 Windows 窗体项目中

本文关键字:Mono Windows 项目 窗体 应用程序 OSX 创建 | 更新日期: 2023-09-27 18:36:39

我正在尝试使用MonoDevelop 3.0.2创建一个简单的应用程序包。

创建一个新的解决方案空的单Mac项目。添加对 System.Windows.Forms 的引用。使用以下代码创建一个新类:

using System;
using System.Windows.Forms;
namespace MM2
{
    public class Program
    {
        public static void Main()
        {
            MessageBox.Show ("Hello world");
        }
    }
}

这完美地运行在MonoDevelop。然后在"项目选项"对话框中,选择"Mac OS X 打包"屏幕。选中"在应用程序捆绑包中包括单声道运行时"。我将其他选项保留为默认值(平台为 X86)。

通过选择"生成/全部生成"来生成捆绑包。这会在 bin/Debug 文件夹中创建一个 MM.app 捆绑包。

打包程序没有将libgdiplus.dylib复制到捆绑包中,所以我必须手动执行此操作。(如果没有此步骤,应用程序将无法启动,并且控制台日志明确指出 Mono 找不到 libgdiplus)。我将文件 libgdiplus.0.dylib 和链接 libgdiplus.dylib 从/Library/Frameworks/Mono.framework/Libraries 文件夹复制到应用程序包的 Content/Resources 文件夹中。

现在,应用程序捆绑包是独立的,它不需要安装 Mono 运行时。运行时,它会显示消息框。但是在单击"确定"按钮后,程序关闭,Mono 运行时崩溃。这是控制台日志中的堆栈跟踪:

Native stacktrace:
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    0   MM2                                                 0x000a072f mono_handle_native_sigsegv + 287
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    1   MM2                                 0x000058de mono_sigsegv_signal_handler + 334
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    2   libsystem_c.dylib                   0x9435859b _sigtramp + 43
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    3   ???                                 0xffffffff 0x0 + 4294967295
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    4   CoreFoundation                      0x940e4e05 _CFAutoreleasePoolPop + 53
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    5   Foundation                          0x9386ea2f -[NSAutoreleasePool release] + 131
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    6   MM2                                 0x00002b52 main + 1458
6/8/12 6:11:43.089 PM [0x0-0x26026].com.yourcompany.MM2:    7   MM2                                 0x00002555 start + 53

创建 OSX 应用程序捆绑包,同时将 Mono 嵌入到 Windows 窗体项目中

单击"确定"后,程序应结束。 主函数的结束就是应用程序的结束。

如果你有一个事件循环或做某事 - 它不会自动结束。