【问题标题】:Mono on Windows (And General Questions)Windows 上的 Mono(和一般问题)
【发布时间】:2011-02-11 04:56:05
【问题描述】:

我在 Linux 上安装了 MonoDevelop 并编写了一个 shell GTK+ 应用程序。当我编译并运行应用程序时,它会在 Linux 中正确显示。当我将 .exe 移至 Windows 时,出现“Windows 无响应”崩溃,因此没有堆栈跟踪。然后我想我必须为 Windows 安装 Mono,所以我这样做了,但没有运气 - 我仍然崩溃。

更一般地说,我很难想象这里发生了什么。无论我做错了什么,请不要打扰我:

  1. 启动 Mono 项目的人编写了自己的编译器(可能从头开始)来编译 C# 代码。他们在查看 .NET Framework 后对此进行了建模
  2. 他们还为字节码的单声道实现编写了一个 CLR。任何想要运行此代码的架构都需要 Mono Runtime,因为只有 Mono Runtime 才能运行代码。

我说的对吗?为什么我的程序不运行?提前致谢。

【问题讨论】:

  • 如果您的第二点是“使用 Mono 的 C# 编译器编译的代码只能由 Mono CLR 运行”,那么答案是“否”。它也可以由 MS CLR 运行(假设安装了所有必需的库。)
  • 这可能是一个愚蠢的问题,但是您是否通过 Mono 直接启动程序?例如。 mono myprogram.exe
  • @Foole - 如果它可以在 MS CLR 上运行,那么为什么我首先需要在 Windows 中的 Mono 中打开我的项目?如果字节码与 MS CLR 兼容,为什么我不能像打开常规 exe 一样打开它。
  • @Kevin - 根本不是一个愚蠢的问题 - 那就是我做错了。我只是在 Windows 中双击 .exe,认为它应该“知道”用 CLR 打开它——我真的不明白为什么这是不正确的想法。有什么见解吗?谢谢。
  • 我的猜测是您没有在 MS.NET 下安装所需的库。

标签: c# windows linux mono


【解决方案1】:

三件事对我来说很突出:

  1. GTK+。默认情况下,GTK 不是 windows 的一部分或 windows 上的 mono。您必须单独安装。
  2. 外壳应用程序。这意味着 Windows 世界中的一些特别的东西(一个作为(扩展)Windows 桌面外壳的一部分运行的应用程序,而不是作为它自己的程序),听到这些不能交叉运行,我一点也不感到惊讶平台非常好,甚至根本没有。我假设您的意思是“控制台应用程序”,但是为什么需要 GTK+?
  3. 单声道。确保使用单声道调用程序。仅仅因为安装了 mono 并不意味着您的程序与 Microsoft 自己的 .Net 实现的运行方式相同。

【讨论】:

  • 对此的一些澄清 - Mono 包括 GTK# 和 GTK+,因此使用 Mono 调用应用程序应该可以工作。但是,如果您从 Mono 下载页面(包括 GTK+)安装“GTK# for .NET”,该应用程序也可以在 .NET 下运行。
  • 我没有这样做:单声道。确保使用单声道调用程序。仅仅因为安装了 mono 并不意味着您的程序将与 Microsoft 自己的 .Net 实现相比运行。为什么我需要这样做?如果它只是通用的 CLR 代码,为什么无论如何它都不能正确运行?我对某事有一个根本性的误解。感谢您的帮助。
  • @skaz - 您使用一些不属于 .Net 的单声道特定功能 (gtk) 构建了它,因此无法通过 .Net 运行它。
【解决方案2】:

嘿,我自己对 Mono 只是模糊熟悉,但我 - 认为 - 有一个分析工具可以显示可能的可移植性问题。如果你运行它,它会显示任何问题吗?

【讨论】:

  • Mono Migration Analyzer (MoMA) (mono-project.com/MoMA) 旨在将基于 Windows 的程序移植到 mono。我认为它不适用于本案。
【解决方案3】:

您还检查了几件事。

单声道安装程序是否包含 GTK# 库。

如果是,请检查程序集是否在 GAC 中。组件名称为 gtk-sharp.dll、gdk-sharp.dll

如果没有,请复制 bin 目录中的引用程序集。您可以在您的单声道开发项目中看到这一点。

【讨论】:

    【解决方案4】:

    我假设您的意思是您编写了一个 GTK# 应用程序。在这种情况下,要在 Windows 上运行它,您需要确保从 Mono Downloads page 安装“GTK# for .NET”

    【讨论】:

      【解决方案5】:

      在 Windows 上,您可以捕获崩溃转储并查看导致崩溃的原因。例如,使用 WinDbg 来执行这个应用程序。

      http://www.microsoft.com/whdc/devtools/debugging/default.mspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2011-11-23
        • 2011-05-27
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多