TIPS-將Manifest內嵌至EXE檔案

照著 MSDN Create and Embed an Application Manifest (UAC) 一文的說明,為.NET程式附加.manifest檔案註記為需管理者權限執行,並在Visual Studio專案屬性的Post Build Event中加入mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1",以便將manifest直接內嵌在EXE檔裡面。但編譯時一直彈出:

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"" exited with code 9009.

爬文後,發現有兩種解法: 第一種是加上mt.exe的路徑(參考),但開發機器環境各異,寫死路徑可能會導致.csproj在另一台機器上編譯失敗。我決定使用第二種做法,用Notepad等文字編輯器開啟.csproj檔案,會看到如下內容:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"</PostBuildEvent>
  </PropertyGroup>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

將最後<Target ...>外圍的<!-- -->移除,再將<PropertyGroup><PostBuildEvent ...></PropertyGroup>搬到<Target Name="AfterBuild">之間,經過測試,果然就能順利編譯囉!

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
      <PropertyGroup>
        <PostBuildEvent>mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"</PostBuildEvent>
      </PropertyGroup>
  </Target>
</Project>

[2010-08-31更新] 感謝BillChung提醒,VS2008/VS2010已會自動將manifest需要管理權限的註記編譯入EXE檔案,故已不需要mt.exe嵌入的程序。特此補充!

歡迎推文分享:
Published 31 August 2010 07:30 PM 由 Jeffrey
Filed under: , ,
Views: 8,878



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<August 2010>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication