程序兼容性助手认为我的应用程序是一个安装程序。

45
我已经在Win 7 RTM x64上创建了一个.NET C# WinForms应用程序,假设我称之为DataInstaller。当我在除调试器之外的模式下运行此程序(目前仅为一个空表单,没有功能),它可以正常工作,直到我关闭该表单。然后我会收到来自“程序兼容性助手”的消息:

此程序可能未正确安装。

随后我可以选择重新使用推荐的设置安装或表示安装按预期工作。

如果我将应用程序命名为“DataThingy”,这就不是问题,我猜想这与被称为*Setup的程序获得UAC盾牌图标的方式有关。 我认为我可以在应用程序清单中放置一些简单的内容来防止出现这种情况? 我不确定这是否会发生在Vista上,因为我目前无法访问。 更改名称不是选项,关闭UAC也不是选项,请不要建议这样做! 编辑: 我的天啊。 看起来,如果以下任何条件成立,UAC都会干预: Exe名称包含单词Installer AssemblyInfo.cs
AssemblyTitle contains the word 'Installer'
    e.g. [assembly: AssemblyTitle("DataInstaller")]
AssemblyProduct contains the word 'Installer'
    e.g. [assembly: AssemblyProduct("Data Installation Utility")]

'安装程序'也可以称为 '安装设置程序'。

这真是匪夷所思,显然一位老的VB6程序员被调到了Redmond的UAC团队。

我仍然需要一个解决方法,我不愿意接受我的应用程序不能被称为安装程序,因为它不会触及注册表或将任何文件放入Program Files文件夹中。

我假设如果我尝试执行我的名为IAmAVirus.exe的应用程序,UAC会使机器完全被锁定。(事实上,我不敢尝试,因为我并不确定我只是在瞎搞)


3
实际上,Windows只检查文件名中是否包含"setup"或"install"等单词,以确定某个文件是否为安装程序。是的,这很愚蠢... 可以对此采取措施吗?我想知道... 不过这是个好问题。 - Wim ten Brink
希望如此,因为这对我来说有些太过于“魔法字符串”了.. 谢谢你的支持! - Carl
2
@Wim - 不,似乎就像帖子所说的那样是AssemblyTitle。在我的Win7 SP1机器上验证了PackageInstaller.exe - 如果程序集标题是PackageNstaller,则没有问题。 - Josh Sutterfield
3个回答

43
将此添加到你的清单文件中。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <!--The ID below indicates application support for Windows Vista -->
    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
    <!--The ID below indicates application support for Windows 7 -->
    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    <!--The ID below indicates app support for Windows 8 -->
    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    <!--The ID below indicates app support for Windows 8.1 -->
    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
  </application>
</compatibility>

在上一个例子中,所有操作系统的GUID都提供了向下兼容支持。支持多平台的应用程序不需要为每个平台创建单独的清单。

摘自应用程序(可执行文件)清单


非常好用,即使部署到ProgramFiles也没有问题!谢谢Justin。 - Carl
1
当我尝试过后,这并没有产生任何影响...我的工具名叫"ccsetup",因为它替换了原始的设置工具,但只要名称或版本信息中有单词"setup",兼容性问题就会不断出现。当我将其删除时,问题立即消失,但我不想让它有一个不同的名称。 - Nyerguds
4
这是关于Windows 8的特定程序接口{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}的说明。更多详细信息请参考此链接:http://msdn.microsoft.com/en-us/library/windows/desktop/hh848036(v=vs.85).aspx - mjb
{1f676c76-80e1-4239-95bb-83d0f6d0da78} 适用于 Windows 8.1。 - Michael Geier
请查看这篇博客文章 - Chuck Walbourn

3

1
只是添加清单就解决了问题(尽管在发布这篇文章之前我已经尝试过,真心话!)。欲了解更多信息,请参见:http://blogs.msdn.com/cjacks/archive/2009/06/18/pca-changes-for-windows-7-how-to-tell-us-you-are-not-an-installer-take-2-because-we-changed-the-rules-on-you.aspx和http://technet.microsoft.com/en-us/library/dd638326%28WS.10%29.aspx。谢谢。 - Carl
作为更新,不,这个方法没有起作用。一旦exe文件被部署到其他位置,比如<Program Files>,PCA问题就会再次出现。 - Carl
1
老问题,但文件名是让我解决它的关键。将安装程序更改为工具,就可以正常工作了。感谢@EKS的提示。 - DTown

2

我曾经遇到过这个问题,最后通过确保我的AssemblyInfo.cs文件中的程序集标题和我的cs.proj文件的程序集名称匹配来解决了它。当它们不同步时,就会出现这个错误,使它们相同可以消除错误。不确定是否适用于您的情况,但是在类似情况下出现相同的错误,也许值得一试,而不是采纳忽略错误的答案。


这正是我所面临的问题。感谢你指出来,即使问题已经得到解答。我一直认为这是清单设置的问题,但实际上是在项目属性中更改了“程序集名称”,而它与“默认命名空间”不匹配。 - strider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接