我复制。你当然不能在 Win10 版本 1607 上实现这一点,嵌入在 wuapi.dll 中的类型库缺少 IUpdateInstaller3 和 IUpdateInstaller4 接口。Oleview c:\windows\system32\wuapi.dll
当您从开发人员命令提示符运行时,您可以自己看到一些东西。
不是唯一的问题,请注意Wuapi_p.h
MSDN 文章中引用的头文件。它还缺少我在我的机器上安装的 Win10 SDK 版本(版本 10.0.10586.0)。有一个更新的版本可用 (14393)。请注意,如果它包含它,我一直在避免它,因为我在以前的版本中遇到了可怕的安装问题。
不是唯一的问题,MSDN 缺少 IUpdateInstaller3 的定义。这使得很难猜测如何在 C# 中正确声明缺少的接口。您可能会猜测 IUpdateInstaller3 只是添加了一种方法。
但是,它确实实现了接口。使用 MSDN 文章中记录的 IID 查询它在我的机器上可以正常工作:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program {
static void Main(string[] args) {
var obj = new WUApiLib.UpdateInstaller();
var punk = Marshal.GetIUnknownForObject(obj);
var iid4 = new Guid("EF8208EA-2304-492D-9109-23813B0958E1");
IntPtr itf4;
var hr = Marshal.QueryInterface(punk, ref iid4, out itf4);
Debug.Assert(hr == 0 && itf4 != IntPtr.Zero); // fine
}
}
但这不会帮助您进行调用,而不是没有接口定义。顺便说一句,这些都是典型的“敏捷”问题,这是微软如今开展业务的常见问题。麻烦的是你这样做太早了,下一个版本可能会更好。这可能是目前处于技术预览阶段的 Windows Server 2016。如果您打算通过自己声明接口来解决此问题,请记住,您的 IUpdateInstaller4 声明必须包含以前接口版本的所有方法,接口继承不起作用。