使用 MONO_IOMAP 来处理硬编码文件路径?

Use of MONO_IOMAP to cope with a hard-coded file path?

我正在尝试使用 Mono 在 Linux 下将 Windows .NET 二进制文件转换为 运行。该应用 运行 在 Windows 上运行良好。它目前在 Mono 下失败,因为它找不到具有硬编码路径的文件。

为了测试,我在 Windows 下使用 Fedora 23 VirtualBox VM 运行ning 7. 所有文件都存在于 VM 的 FS 上(不与 Windows 共享财政司司长)。安装的Mono版本是4.0.5.

修改不实用and/or重新编译应用

应用环境:

我正在调用 app.exe 如下:

#!/bin/bash
pushd /way/down/in/this/directory
export MONO_IOMAP=<whatever>
mono app.exe

我已经用以下每个文件配置尝试了 MONO_IOMAP(大小写、驱动器、全部)的每个有效值:

  1. 将 "This.file" 重命名为 "C\:\BLAH\This.file"(包含文字冒号和单个文字反斜杠的文件名)并将副本放置在与 app.exe 相同的目录中。

  2. 复制"This.file"到“/BLAH/This.file”

无论我使用什么 MONO_IOMAP 值,该应用程序仍然设法抱怨无法找到 "This.file"。

我对 .NET 几乎一无所知(我在 Linux 下开发 C++ 和 Python 应用程序),这是我第一次尝试使用 Mono,所以我很容易遗漏一些基础知识线索。

MONO_IOMAP 的 Mono 文档没有提供它启用的转换的具体示例(防止复制粘贴尝试方法),也没有提供有关其使用的上下文建议。网络搜索未能发现任何东西。

还有什么我应该尝试的吗?

硬编码 Windows drives 是一个问题,因为 "C:" 之类的东西是有效的目录。

'easiest' 解决这个问题的方法是实际创建完整的 Window "drive" 路径并使用 MONO_IOMAP=case,'best' 方法是更正代码 ;-)

假设您的程序硬编码@"C:\BLAH\This.file" 或@"BLAH\This.file",然后根据您的 CIL .exe 运行:

目录结构:

tree
.
├── C:
│   └── blah
│       └── This.file
├── blah
│   └── This.file
└── monoio.exe

使用 MONO_IOMAP=case

的示例输出
MONO_IOMAP=case mono monoio.exe
BLAH\This.file
works....
C:\BLAH\This.file
works....

示例代码:

using System;
using System.IO;

namespace monoio
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var hardPath = @"BLAH\This.file";
            Console.WriteLine (hardPath);
            FileStream file;
            try {
                file = File.Open (hardPath, FileMode.Open);
                file.Close ();
                Console.WriteLine("works....");
            } catch (Exception ex) {
                Console.WriteLine (ex.Message);
            }

            var hardPathVolume = @"C:\BLAH\This.file";
            Console.WriteLine (hardPathVolume);
            try {
                file = File.Open (hardPathVolume, FileMode.Open);
                file.Close ();
                Console.WriteLine("works....");
            } catch (Exception ex) {
                Console.WriteLine (ex.Message);
            } 
        }
    }
}