12

我正在尝试使用 raspbian 发行版(“Debian GNU/Linux wheezy/sid”)让 mono(Debian 2.10.8.1-5)在我的树莓派上正常运行。我已经使用 apt-get install mono-complete 安装了单声道。

但是,我遇到了一个我无法弄清楚的有趣问题。DateTime.ToString() 方法返回无效字符串。

您可以在下面找到我的带有控制台输出的示例程序:

using System;

namespace MonoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime now = DateTime.Now;
            Console.WriteLine("Year: " + now.Year);
            Console.WriteLine("Month: " + now.Month);
            Console.WriteLine("Day: " + now.Day);
            Console.WriteLine("DayOfWeek: " + now.DayOfWeek);
            Console.WriteLine("DateTime.Now: " + DateTime.Now);
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
        }
    }
}

输出:

pi@raspberrypi ~/bin $ mono MonoTest.exe
Year: 2012
Month: 8
Day: 3
DayOfWeek: Friday
DateTime.Now: 00/734718/0001 01:41:38
0001-00-734718

有趣的是,734718 似乎是自 01/01/0001 到今天为止的天数。我已经在第二块板上进行了全新安装,但遇到了同样的问题。

有谁知道这里的问题是什么以及如何说服 DateTime.ToString() 返回正确的值?

更新(2012 年 8 月 4 日):在对单声道源代码进行长时间挖掘之后,我能够将问题追溯到 System.Math.Floor。显然,它总是返回 0。我将测试程序更改为简单的:

static void Main(string[] args)
{
    Console.WriteLine("Floor(1.5): " + System.Math.Floor(1.5));
}

在 Windows 上,结果是“Floor(1.5): 1”,而我在树莓派上的单声道设置是“Floor(1.5):0”。我已经看到 System.Math.Floor 被实现为

[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static double Floor (double d);

明天,我将进一步研究这个问题。有谁知道为什么会存在这个问题?

4

4 回答 4

6

这是 Mono 错误#7938,它不仅影响 DateTime.ToString,还影响任何直接或间接将浮点数传递给库调用的函数,当在 ARM 上运行时,使用为硬浮点构建的 Linux 发行版ABI。更多详细信息可在C# on Raspberry Pi wiki 页面上找到。目前没有很好的解决方案,除了运行软浮动发行版。我仍然希望我们能尽快获得一个固定的单声道运行时。

于 2013-03-11T15:11:15.967 回答
3

我无法在 Windows 上重现您的问题(没有覆盆子,但您的主题说Mono)。

我将您的确切源代码复制并粘贴Main()到一个新的 Mono 控制台应用程序 (Mono 2.6.1) 中,添加了一行 ( Console.ReadLine();),然后运行它:

using System;

namespace TestDateTimeNow
{

  class MainClass
  {
    public static void Main (string[] args)
    {
        DateTime now = DateTime.Now;
        Console.WriteLine("Year: " + now.Year);
        Console.WriteLine("Month: " + now.Month);
        Console.WriteLine("Day: " + now.Day);
        Console.WriteLine("DayOfWeek: " + now.DayOfWeek);
        Console.WriteLine("DateTime.Now: " + DateTime.Now);
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
        Console.ReadLine();
    }
  }
}

我得到下面的输出:

Mono 应用程序控制台应用程序输出

于 2012-08-04T04:11:24.140 回答
1

这很可能是 ARM Mono 二进制层错误。特别是因为您运行的是在 Raspberry Pi 之前发布的版本。在mono-devel mailing list上,你会有更好的运气。这可能已经在 git 中修复了。

于 2012-08-04T10:06:03.053 回答
0

为此,您需要使用软浮点操作系统。例如 2013-05-29-wheezy-armel.zip。

硬浮点不适用于 JITers。我有同样的问题,通过在我的 RP 上安装操作系统的软浮点版本来解决它。我不建议在树莓派平台下使用带有硬浮点操作系统的 .net。希望这可以帮助。

于 2013-09-17T19:42:31.817 回答