2013-04-29 34 views
0

我已經開始直接使用MSBuild API來擴展構建過程並增加靈活性。爲VC++使用MSBuild API時活動的用戶名差異?

我已成功實現了構建項目的整個過程,但並非沒有幾個「陷阱」。由於MSBuild API的文檔和使用示例極度缺乏,我不得不忍受一些冗長的調試會話。

希望我在這裏列出的細節能夠幫助其他人直接與MSBuild API集成。編譯C#代碼非常容易,但是一旦我嘗試使用MSBuild API來編譯我們的一些傳統VC++項目,這個過程真的遇到了一個障礙。

這是我的編譯器包裝的一個代碼示例:

  globalProperties["Configuration"] = CommonLibrary.BuildMode.Release.ToString(); 

      //add the compiler variables from the specific project to the properties dictionary 
      if (compilerVariables != null) 
      { 
       foreach(var kvp in compilerVariables) 
       { 
        globalProperties.Add(kvp.Key, kvp.Value); 
       } 
      } 

      //set up a build request to be sent to MSBuild 
      var request = new BuildRequestData(project.SolutionFile.FullName, globalProperties, null, new string[] { "Rebuild" }, null); 

      //configure settings for MSBuild specifically 
      var buildParams = new BuildParameters(); 
      buildParams.EnableNodeReuse = true; 

      buildParams.Loggers = new List<Microsoft.Build.Framework.ILogger>() 
      { 
       buildLogger, 
       fileLogger 
      }; 

      //instantiate the BuildManager, kick off the build, and get the results 
      BuildManager buildManager = new BuildManager(); 
      project.BuildResult = buildManager.Build(buildParams, request); 

該方法的另一個方面涉及.props文件VC++使用,以獲得在INCLUDE所需接頭(和其他路徑)。這個.props文件位於C:\ Users \%BUILDACCOUNT%\ AppData \ Local \ Microsoft \ MSBuild \ v4.0 \ Microsoft.Cpp。%TargetPlatform%.user.props

現在出現一個有趣的部分。

當我對C#項目/解決方案運行此代碼時,一切正常。這是因爲.props文件不參與C#編譯(包含路徑以.csproj級別存儲)。

但是,當針對包含VC++項目的解決方案運行時,此方法完全落在它的表面上。原因是因爲它無法解析可能位於道具文件(在上面詳述的位置)內的INCLUDE路徑。

另一個有趣的tid位是我可以直接從命令行復制參數到MSBuild,並且構建成功。這讓我很困惑......所以我打開了詳細的診斷程序並再次運行我的測試用例。

從日誌有趣的信息(日誌已被修剪):

  1. 從命令行建築

USERDOMAIN = [刪除]

USERNAME = MyUserName輸入

LOCALAPPDATA = C:\ Users \ MyUserName \ AppData \ Local

  1. 從API大廈

USERDOMAIN = [絕密]

USERNAME = BUILDMACHINE $

LOCALAPPDATA = C:\ WINDOWS \ system32 \設置\ systemprofile \應用程序數據\本地

正如您所看到的,似乎從CLI構建時的當前身份正確設置爲我的身份。但是,使用API​​進行構建可將當前身份設置爲本地系統。這導致INCLUDE路徑未正確設置爲API構建,因爲具有該信息的props文件在預期位置(C:\ Windows \ system32 \ config \ systemprofile \ AppData \ Local)不可用。

我的解決方法似乎到目前爲止工作是實際將所有道具文件從AppData位置移動到API所期望的目錄中。我不認爲這是預期的行爲...它似乎不是很清楚。

其他注意事項:

  • 這段代碼被託管在IIS,運行爲「MyUserName輸入」(而不是本地系統)的應用程序池中。
  • 我已經能夠重現上兩臺不同的機器都運行Windows Server 2008

這個問題無論是我錯誤地做一些事情,或MSBuild的API被錯誤地做什麼?任何有關獲取MSBuild API所識別的道具文件的官方手段的輸入都會非常有用。

謝謝。

回答

1

好的,我已經找出了問題所在。

該問題與MSBuild無關。相反,它與我的IIS配置有關。

儘管我的應用程序池正在使用我的構建帳戶的身份運行,但我有「Load User Profile = False」選項,導致用戶配置文件默認爲LocalSystem。

將此設置切換爲「Load User Profile = True」修復了此問題,並且MSBuild開始訪問正確的.props文件。