我有一种情况,我在 .Net C# 中有一个 Windows 桌面应用程序,它必须在 Windows 7 和 Windows XP 上重命名快捷方式。我让它在 Windows 7 中工作,但在 XP 上失败了。
.Net 4.0 Client Profile and Extended 安装在 XP 上,应用程序的所有其他部分都在 XP 上运行。该项目有一个参考Interop.Shell32(MIcrosoft Shell Controls and Automation through COM Interop rahter than pinvoke),代码如下:
var shl = new Shell32.Shell();
argStrLnkPath = System.IO.Path.GetFullPath(argStrLnkPath);
var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(argStrLnkPath));
var itm = dir.Items().Item(System.IO.Path.GetFileName(argStrLnkPath));
itm.Name = "My Shortcut Name";
以上适用于7,但不适用于XP。存在以下版本的 Shell32.dll:
Win7 Shell32.dll 版本 6.1.7601 WinXP Shell32.dll 版本 6.00.29.6242
当我在对象浏览器中监视 XP shell32dll 时,存在相同的对象,因此功能应该在那里(除非我没有看到重要的东西)。
我的项目设置为两台机器的 x86 平台。作为参考,我已尝试将嵌入互操作类型设置为 True,并将本地复制为 False。
我有一个 msi 安装程序,但我需要在目标 XP 机器上做些什么吗?我应该复制本地吗?关于让这个工作的正确方法有什么想法吗?
我已经在 XP 机器上运行了代码,并从事件查看器收到以下信息:
框架版本:v4.0.30319 描述:进程因未处理的异常而终止。异常信息:System.InvalidCastException
Embed Interop Types for Reference = True:此错误的 stackTrace 是:无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“Shell3 2.Shell”。此操作失败,因为 IID 为“{866738B9-6CF2-4DE8-8767-F794EBE74F4E}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE) )。
Embed Interop Types for Reference = False:此错误的 stackTrace 是:框架版本:v4.0.30319 描述:由于未处理的异常,该进程已终止。异常信息:System.IO.FileNotFoundException