Windows XP上的C#.Net应用程序无法使用Shell32代码重命名快捷方式

时间:2013-06-05 13:34:01

标签: c# windows-xp shell32.dll

我的情况是我在.Net C#中有一个Windows桌面APP,必须在Windows 7和Windows XP上重命名一个快捷方式。我有它在Windows 7中工作但在XP上失败了。

.Net 4.0 Client Profile and Extended安装在XP上,而applciation的所有其他部分都在XP上运行。该项目有一个参考Interop.Shell32(通过COM Interop rahter而不是pinvoke的MIcrosoft Shell控件和自动化),代码简单如下:

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平台。作为参考,我尝试将Embed Interop Types作为True,并将local复制为False。

我有一个msi安装程序但是我需要在目标XP机器上做些什么吗?我应该复制本地吗?关于使用这种方法的方法的任何想法?

我在该XP机器上运行代码并从事件查看器接收以下内容:

框架版本:v4.0.30319 描述:由于未处理的异常,进程终止。 异常信息:System.InvalidCastException

为参考嵌入互操作类型= True :此错误的stackTrace是: 无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“Shell3” 2.Shell”。此操作失败,因为在COM组件上调用QueryInterface 与IID'{866738B9-6CF2-4DE8-8767-F794EBE74F4E}'的接口失败 由于以下错误:不支持此类接口(来自HRESULT的异常:  0x80004002(E_NOINTERFACE))。

为引用嵌入互操作类型= False :此错误的stackTrace为: 框架版本:v4.0.30319描述:由于未处理的异常,进程终止。异常信息:System.IO.FileNotFoundException

1 个答案:

答案 0 :(得分:0)

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