下面的代码创建了应用程序的副本,并为副本添加了资源。当您运行包含资源的副本时,首先执行它的工作。但是当它退出时,它会退出程序兼容性助手错误:
图片来自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
<小时/> 备注 (其中一些让我认为错误消失了):
作为单个exe项目,没有额外的dll(因为我的额外dll已经消失,没有发生错误)
肯定:错误与运行代码无关(空主方法)
答案 0 :(得分:0)
问题是人们的贪得无厌! Windows上有不需要的文件名。微软似乎阻止人们编写新的安装程序。它们会产生兼容性错误,以防止某些软件变得流行和传播。
示例:强>
如果您使用Resource Hacker(在Win7上测试):
ResHacker.exe
重命名为 ResH Installer acker.exe
ResH 4kj545ui45kj4 acker.exe
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