程序兼容性助理认为我的应用是安装程序
Posted
技术标签:
【中文标题】程序兼容性助理认为我的应用是安装程序【英文标题】:Program Compatibility Assistant thinks my app is an installer 【发布时间】:2010-12-07 08:06:49 【问题描述】:我在 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 程序员被调到了雷德蒙德的 UAC 团队。
我仍然需要解决方法,我不准备接受我的应用程序不可能被称为安装程序,因为它不涉及注册表或将任何文件放入 Program Files 文件夹中。
我假设如果我尝试执行名为 IAmAVirus.exe 的应用程序,UAC 会将计算机完全锁定。 (其实我不敢尝试,因为我不完全相信我只是在傻)
【问题讨论】:
实际上,Windows 只是检查文件名中是否有“setup”或“install”之类的词来确定某个东西是否是安装程序。是的,这很愚蠢......可以做些什么吗?我想知道...不过 Q 很好。 我希望如此,因为这对我来说有点太“神奇”了。感谢您的投票! @Wim - 不,它似乎是像帖子所暗示的 AssemblyTitle。在我的 Win7 SP1 机器上验证 PackageInstaller.exe - 如果程序集标题是 PackageNstaller 则没问题 【参考方案1】:将此添加到您的清单中。
<?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 都提供了低级支持。支持多个平台的应用不需要为每个平台提供单独的清单。
取自App (executable) manifest。
【讨论】:
即使部署到 ProgramFiles 也能像魅力一样工作!谢谢贾斯汀。 这在我尝试时没有任何区别...我的工具被称为“ccsetup”,因为它用该名称替换了原始设置工具,但只要名称或版本信息里面有“设置”这个词,兼容性垃圾不断弹出。当我删除它时,问题立即消失,但我不希望它具有不同的名称。 4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38 适用于 Windows 8。阅读更多:msdn.microsoft.com/en-us/library/windows/desktop/… 1f676c76-80e1-4239-95bb-83d0f6d0da78 适用于 Windows 8.1 见this blog post。【参考方案2】:就像 Workshop Alex 会根据文件名进行猜测。
但是您是否尝试过添加清单文件?这允许您指定运行应用程序所需的访问权限。
MSDN on how to create one from Visual studio 另一个链接文章help。
【讨论】:
只需添加清单就可以了(尽管我在发布之前确实尝试过,老实说!)。有关更多信息,请参阅:blogs.msdn.com/cjacks/archive/2009/06/18/… 和 technet.microsoft.com/en-us/library/dd638326%28WS.10%29.aspx。谢谢。 作为更新,不,这不起作用。一旦 exe 被部署到另一个位置,例如我刚刚遇到了这个问题,最后通过确保 AssemblyInfo.cs 文件中的程序集标题和我的 cs.proj 文件的程序集名称匹配来解决它。当它们没有同步时,它会抛出这个错误,使它们相同导致它消失。不确定它是否适用于您的情况,但类似情况的相同错误可能值得一试,并避免一起忽略错误的公认答案。
【讨论】:
这正是我面临的问题。感谢您指出这一点,即使问题已得到解答。我以为这是清单设置,但我更改了项目属性中的Assembly name
,它与Default namespace
不匹配。以上是关于程序兼容性助理认为我的应用是安装程序的主要内容,如果未能解决你的问题,请参考以下文章
从应用程序包安装时,应用程序与设备(iPad 3 和 4)不兼容