.NET Framework 4.7.2迁移至.NET Core平台时SHDocVw库中ShellWindows与InternetExplorer类型缺失问题解决咨询
解决.NET Core中SHDocVw的ShellWindows/InternetExplorer找不到的问题
你遇到的问题很典型——SHDocVw是.NET Framework中依赖COM互操作的专属库,直接迁移到.NET Core时,会因为缺少对应的跨平台兼容互操作程序集而报错。下面给你两种清晰的解决思路:
一、安装兼容NuGet包复用原有代码
你可以直接安装Microsoft.Windows.SHDocVw这个NuGet包,它专门提供了.NET Core兼容的SHDocVw互操作类型:
- 打开NuGet包管理器,搜索并安装
Microsoft.Windows.SHDocVw - 或者在Package Manager Console中执行命令:
Install-Package Microsoft.Windows.SHDocVw
安装完成后,你原有代码var list = new ShellWindows().Cast<InternetExplorer>().ToList();就能正常编译运行了。需要注意的是,这个包仅支持Windows平台,毕竟SHDocVw本身是Windows专属的COM组件。
二、替代方案:用P/Invoke枚举IE窗口(摆脱COM依赖)
如果不想依赖COM互操作包,你可以通过Windows原生API直接枚举IE窗口。IE的主窗口类名是IEFrame,可以用EnumWindows和GetClassName实现:
首先定义P/Invoke方法:
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; public class IEWindowEnumerator { private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); public static List<IntPtr> GetAllIEWindows() { List<IntPtr> ieWindows = new List<IntPtr>(); EnumWindows((hWnd, lParam) => { if (IsWindowVisible(hWnd)) { StringBuilder className = new StringBuilder(256); GetClassName(hWnd, className, className.Capacity); if (className.ToString() == "IEFrame") { ieWindows.Add(hWnd); } } return true; }, IntPtr.Zero); return ieWindows; } }
调用IEWindowEnumerator.GetAllIEWindows()就能获取所有可见的IE窗口句柄。如果你的业务逻辑需要操作窗口内容(比如获取URL、触发导航),还可以结合其他Windows API进一步扩展;但如果只是需要枚举窗口,这个方案会更轻量。
内容的提问来源于stack exchange,提问作者Sančiezz
相关产品推荐
相关产品推荐

