如何添加没有兼容性错误的资源?

时间:2013-06-27 13:47:15

标签: c# winapi resources compatibility

下面的代码创建了应用程序的副本,并为副本添加了资源。当您运行包含资源的副本时,首先执行它的工作。但是当它退出时,它会退出程序兼容性助手错误:

enter image description here 图片来自Google。

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,App 86x

<小时/> 备注 (其中一些让我认为错误消失了)

  • 可能会清理导入的库可能会有所帮助
  • 可能是Assemblyname或名称空间
  • 似乎兼容性助理检查过多,并且当程序执行与助理期望不同的操作时认为有问题。
  • 作为单个exe项目,没有额外的dll(因为我的额外dll已经消失,没有发生错误)

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

  • 肯定:错误与文件名相关

1 个答案:

答案 0 :(得分:0)

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

示例:

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

  1. 转到Resource Hacker的安装目录。
    • 运行它,关闭它。没问题,
  2. ResHacker.exe 重命名为 ResH Installer acker.exe
    • 运行它,关闭它,看看问题。
  3. 将其重命名为 ResH 4kj545ui45kj4 acker.exe
    • 运行它,关闭它。没问题。
  4. 将其重命名为 ResHacker.exe
  5. <强>警句:

    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