2011-07-04 30 views
1

我正在嘗試爲Windows Azure創建一個在啓動時加載自定義EXE的Worker Role項目。我改編自大衛周杰倫的碼頭服務器實例代碼在這裏找到:爲什麼GetEnvironmentVariable()在Windows Azure中爲我的RoleRoot返回錯誤的目錄?

http://blogs.msdn.com/b/dachou/archive/2010/03/21/run-java-with-jetty-in-windows-azure.aspx

使用的Visual Web Developer 2010年,我創建了Visual C#中新的雲項目,並在他的Worker角色類代碼下降如下所示:

namespace WorkerRole1 
{ 
    public class WorkerRole : RoleEntryPoint 
    { 
     public override void Run() 
     { 
      string response = ""; 
      string S = ""; 

      try 
      { 
       System.IO.StreamReader sr; 
       string port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpIn"].IPEndpoint.Port.ToString(); 
       string roleRoot = Environment.GetEnvironmentVariable("RoleRoot"); 

       S = "roleRoot is: " + roleRoot; 
       Trace.TraceInformation(S); 

       // string myAzureAppHome = roleRoot + @"\approot\app"; 
       string myAzureAppHome = System.IO.Path.Combine(roleRoot + @"\", @"approot\"); 

       S = "myAzureAppHome is: " + myAzureAppHome; 
       Trace.TraceInformation(S); 


       // string jreHome = roleRoot + @"\approot\app\jre6"; 
       Process proc = new Process(); 
       proc.StartInfo.UseShellExecute = false; 
       proc.StartInfo.RedirectStandardOutput = true; 
       //proc.StartInfo.FileName = String.Format("\"{0}\\bin\\java.exe\"", jreHome); 
       // proc.StartInfo.Arguments = String.Format("-Djetty.port={0} -Djetty.home=\"{1}\" -jar \"{1}\\start.jar\"", port, myAzureAppHome); 
       proc.StartInfo.FileName = String.Format("\"{0}\\myAzureAppPRJ.exe\"", myAzureAppHome); 

       S = "Attempting to run file: " + proc.StartInfo.FileName; 
       Trace.TraceInformation(S); 

       proc.EnableRaisingEvents = false; 
       proc.Start(); 
       sr = proc.StandardOutput; 
       response = sr.ReadToEnd(); 
      } 
      catch (Exception ex) 
      { 
       response = ex.Message; 
       Trace.TraceError(response); 
      } 
     } 

     public override bool OnStart() 
     { 
      // Set the maximum number of concurrent connections 
      ServicePointManager.DefaultConnectionLimit = 12; 

      // For information on handling configuration changes 
      // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. 

      return base.OnStart(); 
     } 
    } 
} 

問題是我回到RoleRoot的目錄與我在存儲模擬器上運行項目時出現「app」支持文件的位置不匹配。 「應用程序」 文件夾,在這個目錄,我發現通過搜索WindowsAzureProject2目錄樹中結束:

C:\用戶\ mycomp \文檔\ Visual Studio 2010的\項目\ WindowsAzureProject2 \ WorkerRole1 \應用

但GetEnvironmentVariable (「RoleRoot」)將以下報告作爲RoleRoot目錄報告爲由我的Trace語句轉儲:

C:\ Users \ mycomp \ documents \ visual studio 2010 \ Projects \ WindowsAzureProject2 \ WindowsAzureProject2 \ bin \ Debug \ WindowsAzureProject2.csx \角色\ WorkerRole1

哪一個當然會導致文件未找到異常當調用proc.Start()時,因爲自定義EXE文件位於前目錄中,而不是後者。

任何人都可以告訴我爲什麼roleRoot路徑似乎是拙劣的,我能做些什麼來解決這個問題?請注意,我知道EXE之前我的任務分配到proc.StartInfo.FileName(是Visual Web Developer C#與Visual Studio Pro C#不同?),但修復不會改變我遇到的路徑問題的雙反斜槓問題因爲GetEnvironmentVariable(「RoleRoot」)返回的目錄不包含我的「app」目錄。

UPDATE:在做了一些更多的閱讀之後,我發現真正發生的事情是「approot」目錄沒有被創建,我的「app」文件夾文件也沒有被複制。我仍然無法弄清楚爲什麼。

- roschler

回答

2

看起來你並沒有在應用程序目錄中的文件添加到Visual Studio項目。確保它們已添加並將其「複製到輸出目錄」屬性設置爲「始終複製」(或「如果是新的複製」)。然後他們應該像你期望的那樣結束%RoleRoot%。

+0

謝謝!那樣做了。我加了他們,但顯然默認的屬性設置是「從不復制」。一旦我遵循你的建議,並改變它「總是複製」的一切開始工作。請注意,不能將其設置爲文件夾級別,您必須通過編輯文件級別的屬性來完成此操作。 –

相關問題