在MSDN2005按需更新的示例中,有下面一些代码:
private void MainForm_Load(object sender, EventArgs e)
{
_appDeployed = ApplicationDeployment.IsNetworkDeployed;
isDeployedBox.Text = _appDeployed.ToString();
customerLocalBox.Text = IsLocal("customer").ToString();
orderLocalBox.Text = IsLocal("order").ToString();
if (_appDeployed)
{
_appDeployment = ApplicationDeployment.CurrentDeployment;
//Register events for async work
_appDeployment.DownloadFileGroupProgressChanged += new DeploymentProgressChangedEventHandler(OnDownloadFileGroupProgressChanged);
_appDeployment.DownloadFileGroupCompleted += new DownloadFileGroupCompletedEventHandler(OnDownloadFileGroupCompleted);
}
}
// Checks if group is already local.
private bool IsLocal(string groupName)
{
try
{
if (_appDeployment.IsFileGroupDownloaded(groupName))
return true;
else
return false;
}
catch (Exception err)
{
MessageBox.Show(err.Message);
return false;
}
}
我们看看这行代码:
customerLocalBox.Text = IsLocal("customer").ToString();
它执行的结果肯定是false,因为_appDeployment此时还没有赋值,对_appDeployment的赋值在后面的代码中进行,IsLocal方法肯定出现异常,也就一定返回false;而这和程序的设计初衷应该是不符合的。
但是,这个程序的逻辑掩盖了这个错误,使其在第一次安装时不会测试出程序中的这个错误,因为第一次运行安装时即时没有这个错误,也应该返回false,所以不会有人注意到其中的问题,但第二次再运行这个程序时就会出现错误了。