环境:
Microsoft Visual Studio 2010 SP1
C# - .NET 4.0
问题:
一切正常,除了安装。
经过深思熟虑和研究后,我怀疑这个问题是一个企图从“ - 类型'System .__ ComObject'的COM对象转换为接口类型'WUApiLib.UpdateInstaller'。”可以在代码中可以看到,IID和类型已经设置但是参数的值是可疑的。以下是运行时错误报告:
发现了System.InvalidCastException。消息=指定的强制转换不是 有效。 Source = PROGRAM_NAME StackTrace: 在WUApiLib.IUpdateInstaller.Install() 在%PATH%\ visual studio 2010 \ Projects \ ...中的PROGRAM_NAME.WindowsUpdates.InstallUpdates(UpdateCollection updatesToInstall) 的InnerException:
请求
经过数小时的研究和研究,我们将非常感谢您解决安装更新问题的任何帮助。请参阅以下代码段。
程序会尝试以下操作:
- 启用了Windows更新服务(没问题)
- 需要更新主机:(没问题)
- 下载更新:(没问题)
public static UpdateCollection DownloadUpdates()
{
// Returns UpdateCollection object.
}
- 尝试安装更新。 (例外:指定演员表无效。)
public static void InstallUpdates(UpdateCollection updatesToInstall)
{
IUpdateInstaller updateInstaller;
Console.WriteLine("Creating UpdateInstasller...");
//Type itype = Type.GetTypeFromProgID("Microsoft.Update.Session", true);
//Type t = Type.GetTypeFromProgID("Microsoft.Update.Session", "127.0.0.1")
Type itype = Type.GetTypeFromProgID("Microsoft.Update.Installer", true);
updateInstaller = (UpdateInstaller)Activator.CreateInstance(itype);
updateInstaller.Updates = updatesToInstall;
updateInstaller.ClientApplicationID = "{3442D4FE-224D-4CEE-98CF-30E0C4D229E6}"; // Unsure of IID
IInstallationResult installationResult;
Console.WriteLine("Creating UpdateInstallationResult...");
updateInstaller.IsForced = true;
if (updateInstaller.IsBusy == false)
{
try
{
installationResult = updateInstaller.Install(); // ***Bad Cast exception here.***
if (updatesToInstall.Count > 0)
{
for (int i = 0; i < updatesToInstall.Count; i++)
{
if (installationResult.GetUpdateResult(i).HResult == 0)
Console.WriteLine("Installed : " + updatesToInstall[i].Title);
else
Console.WriteLine("Failed : " + updatesToInstall[i].Title);
// Is Reboot Required?
if (installationResult.RebootRequired == true)
Console.WriteLine("Reboot is required for one of more updates.");
} // end for
} // end if
} // end try
catch (Exception e)
{
Console.WriteLine("Error:: " + e.Message + "\n");
}
} // end if
} // end method