C# .Net应用在Windows XP上失败,Shell32代码用于重命名快捷方式

4
我有一个情况,我有一个在.Net C#中编写的Windows桌面应用程序,必须在Windows 7和Windows XP上重命名快捷方式。 我已经在Windows 7上运行它,但在XP上失败了。
在XP上安装了.Net 4.0客户端配置文件和扩展,并且应用程序的所有其他部分都在XP上运行。该项目引用Interop.Shell32(通过COM互操作而不是pinvoke实现的Microsoft Shell Controls and Automation),代码如下:
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";

以下内容适用于Win7,但不适用于XP。Shell32.dll有以下版本:
Win7 Shell32.dll版本为6.1.7601 WinXP Shell32.dll版本为6.00.29.6242
当我在对象浏览器中查看XP shell32dll时,相同的对象存在,因此应该有功能(除非我没有看到重要的东西)。
我的项目设置为在两台机器上都构建为x86平台。对于参考文献,我已经尝试将Interop类型嵌入为True,并将复制本地设置为False。
我有一个msi安装程序,但是在目标XP机器上需要做些什么吗?并且是否应该复制本地?您有关于正确使其工作的任何想法吗?
我在该XP机器上运行代码,并从事件查看器中收到以下信息:
框架版本:v4.0.30319 描述:由于未处理的异常,进程被终止。 异常信息:System.InvalidCastException
参考= True的Interop类型嵌入:此错误的堆栈跟踪如下: 无法将类型为“System.__ComObject”的COM对象强制转换为接口类型“Shell32.Shell”。此操作失败,因为针对IID为'{866738B9-6CF2-4DE8-8767-F794EBE74F4E}'的接口的COM组件的QueryInterface调用失败,原因是出现以下错误:不支持此接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))。
参考= False的Interop类型嵌入:此错误的堆栈跟踪如下: 框架版本:v4.0.30319 描述:由于未处理的异常,进程被终止。 异常信息:System.IO.FileNotFoundException

自从我最初的帖子之后,我还尝试使用了IWshRuntimeLibrary(Windows脚本宿主对象模型),编写了代码,创建了一个新的快捷方式,并在Windows 7上成功构建和验证。然而,在Windows XP上失败了。为了使用它,必须将设置设置为Enbed Interop Types = False,Copy Local = True,Isolated = False。 - meme
1
问题已解决!我之前没有意识到,当你进行这些COM互操作包含时,它们必须有一个安装程序项目(如果要在另一个系统上运行,则需要msi安装程序)。另外,还有一个注意事项是,如果您已经创建了一个安装程序项目,则必须再次添加>项目输出。这将自动将所有这些互操作包含项放在“检测到的依赖项”文件夹下。这解决了我的问题。 - meme
1个回答

0
问题解决了!我没有意识到当你进行这些类型的COM互操作包含时,它们必须有一个安装程序项目(如果要在另一个系统上运行,则为msi安装程序)。另一个注意事项是,如果您已经创建了一个设置项目,则必须再次添加>项目输出。这将自动将所有这些互操作包含项拉入检测到的依赖项文件夹中。这解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接