4

我有一种情况,我在 .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

4

1 回答 1

0

问题解决了!我没有意识到当你制作这些类型的 COM 互操作包含时,它们必须有一个安装项目(如果在另一个系统上使用 msi 安装程序)。另外,另一个需要注意的是,如果您已经创建了一个设置项目,则必须再次添加 > 项目输出。这将自动将所有这些互操作包含在 Detected Dependencies 文件夹下。这解决了我的问题。

于 2013-06-19T21:34:22.943 回答