我正在尝试使用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)的每个有效值:
将“This.file”重命名为“C \:\\ BLAH \\ This.file”(包含文字冒号和单个文字反斜杠的文件名),并将副本放在与app相同的目录中。 EXE。
将“This.file”复制到“/BLAH/This.file”
无论我使用的MONO_IOMAP有什么价值,该应用仍会设法抱怨无法找到“This.file”。
我对.NET几乎一无所知(我在Linux下开发C ++和Python应用程序),这是我第一次尝试使用Mono,所以我很容易错过一些基本线索。
MONO_IOMAP的Mono文档没有提供它启用的转换的具体示例(防止复制 - 粘贴 - 尝试方法),也没有为其使用提供上下文建议。网络搜索无法发现任何内容。
还有什么我应该尝试的吗?
答案 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);
}
}
}
}