使用 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重新编译应用
应用环境:
应用程序二进制文件位于“/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(大小写、驱动器、全部)的每个有效值:
将 "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 文档没有提供它启用的转换的具体示例(防止复制粘贴尝试方法),也没有提供有关其使用的上下文建议。网络搜索未能发现任何东西。
还有什么我应该尝试的吗?
硬编码 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);
}
}
}
}
我正在尝试使用 Mono 在 Linux 下将 Windows .NET 二进制文件转换为 运行。该应用 运行 在 Windows 上运行良好。它目前在 Mono 下失败,因为它找不到具有硬编码路径的文件。
为了测试,我在 Windows 下使用 Fedora 23 VirtualBox VM 运行ning 7. 所有文件都存在于 VM 的 FS 上(不与 Windows 共享财政司司长)。安装的Mono版本是4.0.5.
修改不实用and/or重新编译应用
应用环境:
应用程序二进制文件位于“/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(大小写、驱动器、全部)的每个有效值:
将 "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 文档没有提供它启用的转换的具体示例(防止复制粘贴尝试方法),也没有提供有关其使用的上下文建议。网络搜索未能发现任何东西。
还有什么我应该尝试的吗?
硬编码 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);
}
}
}
}