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

时间:2015-12-22 17:07:39

标签: .net linux mono

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

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

修改和/或重新编译应用程序是不切实际的。

应用环境:

  • 应用程序二进制文件位于“/way/down/in/this/directory/app.exe”中。符号已被删除。

  • 应用程序有一个硬编码的路径,看起来像“C:\ BLAH \ This.file”。该文件包含应用程序的运行时配置信息。

我正在调用app.exe,如下所示:

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

我已尝试使用以下每种文件配置的MONO_IOMAP(case,drive,all)的每个有效值:

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

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

  3. 无论我使用的MONO_IOMAP有什么价值,该应用仍会设法抱怨无法找到“This.file”。

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

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

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

1 个答案:

答案 0 :(得分:1)

硬编码的Windows drives是一个问题,例如&#34; C:&#34;是有效的目录。

最简单的&#39;解决这个问题的方法是实际创建完整的Window&#34; drive&#34;路径和使用MONO_IOMAP=case,&#39;最佳&#39;方法是纠正代码; - )

假设您的程序硬编码@&#34; C:\ BLAH \ This.file&#34;或@&#34; BLAH \ This.file&#34;,然后根据您的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);
            } 
        }
    }
}