我正在Visual Studio中开发一个应用程序,它在用户系统上安装后需要管理员权限。我添加了一个适当的应用程序清单文件,以确保发生这种情况:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
但是现在如果我想在Visual Studio中调试程序,我需要以管理员身份运行Visual Studio。没有bueno。最令人讨厌的部分是程序在调试期间并不真正需要管理员权限。只有在用户系统上正确安装后才需要这些权限。
是否有一种干净,简单的方法来“抛出一个开关”,在开发过程中禁用管理员要求,然后在我发布应用程序时重新启用它?
编辑:
当我向用户发布应用程序时,我运行了一个使用MSBuild的构建脚本。我要做的是让Visual Studio在Release配置中构建一个解决方案,而不用管理员清单。然后,当我运行构建脚本时,我想让MSBuild包含管理员清单,同时保持相同的版本配置。
答案 0 :(得分:3)
您可以使用预构建事件Project -> Options -> Build Events
制作预制品事件,例如:
del "$(ProjectDir)app.manifest"
if "$(ConfigurationName)"=="Debug" (
copy "$(ProjectDir)app.debug.manifest" "$(ProjectDir)app.manifest"
) else (
copy "$(ProjectDir)app.release.manifest" "$(ProjectDir)app.manifest"
)
这里我们假设您的清单名为app.manifest
并且位于项目的根目录中 - 显然可以根据需要进行修改。
在任何情况下,制作清单文件的两个副本并调用一个app.debug.manifest
和一个app.release.manifest
,对其进行适当配置,这将使用适当的版本替换活动的app.manifest
每个版本。
编辑:
如果您希望MSBuild使用相同的配置但使用与Visual Studio不同的清单,您也可以尝试将上述预构建事件调整为:
del "$(ProjectDir)app.manifest"
if "$(AdminManifest)"=="true" (
copy "$(ProjectDir)app.release.manifest" "$(ProjectDir)app.manifest"
) else (
copy "$(ProjectDir)app.debug.manifest" "$(ProjectDir)app.manifest"
)
现在,当您运行MSBuild时,您可以这样做:
MSBuild.exe MySolution.sln /p:Configuration=WhateverYouWant /p:AdminManifest=true
另见:
答案 1 :(得分:0)
这是几年后我最终这样做的方式(可能对csproj文件和MSBuild进行了许多更改):
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<ApplicationManifest>app.debug.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>