[IADP Series] 應用程式的啟動路徑 (Startup Path) 處理注意事項

得知 app 被 rejected 後,今天花了一點時間修補問題,並且新增一個組態的程式來填補 UIX2 的問題,原本在本機測試時是沒有問題的,後來上傳到 Intel AppUp Developer Center 後,有請 IADP 顧問級人物 Bill Chung 幫忙下載測試 (做 beta tester)...

自得知 app 被 rejected 後,今天花了一點時間修補問題,並且新增一個組態的程式來填補 UIX2 的問題,原本在本機測試時是沒有問題的,後來上傳到 Intel AppUp Developer Center 後,有請 IADP 顧問級人物 Bill Chung 幫忙下載測試 (做 beta tester),但他回報應用程式有問題,我上去 AppUp Dashboard 的 Crash Report 中查詢,看到這樣的訊息:

image

不過我在本機上無法重現這個問題,我處理這一段的原始程式是:

XmlDocument doc = new XmlDocument();
doc.Load(Environment.CurrentDirectory + @"\" +
   this.GetType().Assembly.GetName().Name + ".exe.config"
);

XmlNode nodeConfiguration =
    doc.DocumentElement.SelectSingleNode(
    string.Format("//configuration/oauth.configuration/providers/add[@provider='{0}']",
    this._appOAuthConfigurationItemName));

if (nodeConfiguration == null)
{
    MessageBox.Show(
       "Can't found specified configuration section.", "Configuration Error", 
       MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}
else
{
    nodeConfiguration.Attributes.GetNamedItem("consumerKey").Value = this.txtConsumerKey.Text;
    nodeConfiguration.Attributes.GetNamedItem("consumerSecret").Value = this.txtConsumerSecret.Text;

    doc.Save(Environment.CurrentDirectory + @"\" +
        this.GetType().Assembly.GetName().Name + ".exe.config"
);

    ConfigurationManager.RefreshSection("oauth.configuration");
}

doc = null;
this.Close();

這段程式碼會存取 app.config 並修改資料,並且更新組態資料,但是 Environment.CurrentDirectory 會視應用程式的啟動點而改變,如果用應用程式安裝時產生的捷徑時沒有問題,但如果在 Intel AppUp(SM) Center 程式中啟動程式時,Environment.CurrentDirectory 反而會變成 Intel AppUp(SM) Center 的安裝目錄,以致於程式無法找到 app.config 而擲出例外。

問題根源找出來後,程式碼改為:

XmlDocument doc = new XmlDocument();
doc.Load(
Path.GetDirectoryName(
   new Uri(this.GetType().Assembly.CodeBase).LocalPath) + @"\" +
   this.GetType().Assembly.GetName().Name + ".exe.config"
);

XmlNode nodeConfiguration =
doc.DocumentElement.SelectSingleNode(
   string.Format("//configuration/oauth.configuration/providers/add[@provider='{0}']",
   this._appOAuthConfigurationItemName));

if (nodeConfiguration == null)
{
   MessageBox.Show(
      "Can't found specified configuration section.", "Configuration Error",
      MessageBoxButtons.OK, MessageBoxIcon.Error);
   return;
}
else
{
   nodeConfiguration.Attributes.GetNamedItem("consumerKey").Value = this.txtConsumerKey.Text;
   nodeConfiguration.Attributes.GetNamedItem("consumerSecret").Value = this.txtConsumerSecret.Text;

   doc.Save(Path.GetDirectoryName(
      new Uri(this.GetType().Assembly.CodeBase).LocalPath) + @"\" +
      this.GetType().Assembly.GetName().Name + ".exe.config"
);

   ConfigurationManager.RefreshSection("oauth.configuration");
}

doc = null;
this.Close();

經過顧問級人物 Bill Chung 再次測試後,搞定。

Reference:

IADP 顧問級人物 Bill Chung 的測試報告。