C# .NET 4.5 在没有 shell32.shell() 的情况下获取快捷方式的目标

C# .NET 4.5 Getting target of shortcut without shell32.shell()

我不是一个非常有经验的程序员,而且是 C# 的新手,我在使用 shell32.shell() 获取快捷方式的目标时遇到了一些问题。 我在 Whosebug 上找到了这里的代码 - 它在常规 Windows PC 上运行得很好,但是当在 Citrix 虚拟化 Windows 桌面上执行时(我需要它 运行)它会中断。

代码 运行 通过 foreach 循环通过文件夹中的快捷方式,并过滤掉任何具有可执行目标的内容。问题是,为了找到快捷方式的目标,我使用了下面的代码,一旦它被调用,foreach 就会中断并且不再继续(在 Citrix 上)。

我确定中断发生在第 "var shl = new Shell32.Shell();" 行,该行之后的代码不会触发并退出 foreach(但会继续执行 foreach 之后的代码)。

public static string GetLnkTarget(string lnkPath)
{
    var shl = new Shell32.Shell();
    lnkPath = System.IO.Path.GetFullPath(lnkPath);
    var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath));
    var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath));
    var lnk = (Shell32.ShellLinkObject)itm.GetLink;
    return lnk.Target.Path;
}

有谁知道另一种方法可以找到在 Citrix 虚拟化环境中工作的快捷方式的目标?

我不知道是什么导致了 Shell32.Shell() 在 Citrix 环境中的问题,但我找到了另一种适合我的方法。 答案由用户 djdanlib here:

提供

"添加 IWshRuntimeLibrary 作为对项目的引用。添加引用,COM 选项卡,Windows 脚本主机对象模型。 以下是我如何获取快捷方式的属性:

IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);

快捷方式对象 "sc" 有一个 TargetPath 属性。"