0

下面的代码创建应用程序的副本并向副本添加资源。当您运行其中包含资源的副本时,它首先完成它的工作。但是当它退出时,它会以 Program Compatibility Assistant 错误退出:

在此处输入图像描述 图片来自谷歌。

class Program
{
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern IntPtr BeginUpdateResource([MarshalAs(UnmanagedType.LPStr)] string filename, bool deleteExistingResources);
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern bool UpdateResource(IntPtr resource, [MarshalAs(UnmanagedType.LPStr)] string type, [MarshalAs(UnmanagedType.LPStr)] string name, ushort language, IntPtr data, uint dataSize);
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool EndUpdateResource(IntPtr resource, bool discardChanges);

    private static void modifyResources(string filename)
    {
        IntPtr handle = BeginUpdateResource(filename, true);
        UpdateResource(handle, "10", "1", 0, Marshal.StringToHGlobalAnsi("hello world"), (uint) 11);
        EndUpdateResource(handle, false);
    }

    static void Main(string[] args)
    {
        string exeFilename = Process.GetCurrentProcess().MainModule.FileName;
        string filename = Path.GetFileName(exeFilename);
        string anotherFilename = exeFilename.Replace(filename, "_" + filename);
        File.Copy(exeFilename, anotherFilename, true);
        modifyResources(anotherFilename);
    }
}

我不明白。我会犯什么错误?

更多信息:Win 7 64x,应用程序 86x


注释 (其中一些让我认为错误消失了)

  • 也许清理导入的库可能会有所帮助
  • 可能是 Assemblyname 或命名空间
  • 兼容性助手似乎检查了太多,并认为当程序执行的操作与助手预期的不同时出现问题。
  • 项目作为单个 exe,没有额外的 dll(因为熄灭了我的额外 dll,没有发生错误)

  • 绝对:错误与运行代码无关(空主方法)

  • 绝对:错误与文件名有关
4

1 回答 1

0

问题是人们的贪婪!Windows 上有不需要的文件名。微软似乎阻止人们编写新的安装程序。它们会产生兼容性错误,以防止某些软件变得流行和传播。

例子:

如果您使用 Resource Hacker(在 Win7 上测试):

  1. 进入Resource Hacker的安装目录。
    • 运行它,关闭它。没问题,
  2. 重命名ResHacker.exeResH Installer acker.exe
    • 运行它,关闭它,看看问题。
  3. 将其重命名为ResH 4kj545ui45kj4 acker.exe
    • 运行它,关闭它。没问题。
  4. 将其重命名为ResHacker.exe

妙处:

if (exeFilename.Contains("Installer") && exeFile.isCapableOfResourceManipulation())
    makeProblem();
else
    ignore();
// assembly info is checked too
// confirmed: after removing all unwanted keywords the error stays away
//            even in my old project
于 2013-07-17T15:11:49.470 回答