【问题标题】:Executable is corrupted after writing to disk写入磁盘后可执行文件损坏
【发布时间】:2017-08-28 15:55:29
【问题描述】:

我在类库中有一个可执行文件,该可执行文件在项目属性的“构建操作”字段中标记为嵌入式资源。将文件写入磁盘时,不会引发异常,但尝试运行可执行文件会产生此错误:

“不支持的 16 位应用程序

由于与 64 位版本的 Windows 不兼容,程序或功能“\??\path\to\exe”无法启动或运行。请联系软件供应商询问是否有 64 位 Windows 兼容版本可用。”(不兼容拼写错误是故意的,在错误框中拼写错误)

同样的错误,不同的 exe(来自 Google 图片/MSDN):

我已验证该项目在嵌入 DLL 之前没有损坏,并尝试了许多答案 herehere 将文件写入磁盘,但都没有奏效。它们都产生相同的错误。

将可执行文件写入磁盘的代码:

public static void WriteEmbeddedToDisk(string embeddedFilename, System.Type assemblyType, string diskFilepath)
{
    using (var input = Assembly.GetAssembly(assemblyType).GetManifestResourceStream(embeddedFilename))
    using (var output = File.Create(diskFilepath))
    {
        input.CopyTo(output);
    }
}

运行可执行文件的代码:

public static bool RunExe(string path, string arguments)
{
    try
    {
        var psi = new ProcessStartInfo(path, arguments);
        psi.CreateNoWindow = true;
        psi.UseShellExecute = true;
        psi.RedirectStandardOutput = false;

        var process = Process.Start(psi);

        process.WaitForExit();

        process.Close();
    }
    catch
    {
        return false;
    }
    return true;
}

其他可能重要的信息:

  • 可执行文件在类库 A 中
  • WriteEmbeddedToDisk()RunExe() 在类库 B 中属于同一类
  • 通过同一进程将不同的可执行文件写入磁盘时出现相同的错误。该可执行文件也在类库 A 中。

【问题讨论】:

  • 您是否尝试过在构建设置或程序集中将您的平台目标设置为任何 CPU?
  • @TobiasTheel 是的,目前是。

标签: c# embedded-resource


【解决方案1】:

写入磁盘的文件是 Windows Installer (.msi)。我没有意识到 MSI 文件不能有 .exe 扩展名,因此将扩展名更改为 .msi 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多