2009-03-11 7 views
5

Zurück in .NET 1.0 Tage habe ich eine Methode geschrieben, um das Ziel einer Verknüpfung auf MS Windows zurückzugeben. Sie tat dies durch eine Interop in das Windows-Script mit Object Model und Brute über die COM-Schnittstelle gezwungen Hosting:Gibt es eine Möglichkeit, Windows-Dateisystem-Verknüpfungen programmgesteuert in C# ohne COM zu folgen?

private FileInfo GetFileFromShortcut(FileInfo shortcut) 
{ 
    FileInfo targetFile = null; 

    try 
    { 
     IWshRuntimeLibrary.WshShell wShell = new IWshRuntimeLibrary.WshShellClass(); 
     IWshRuntimeLibrary.WshShortcut wShortcut = (IWshRuntimeLibrary.WshShortcut)wShell.CreateShortcut(shortcut.FullName); 

     // if the file wasn't a shortcut then the TargetPath comes back empty 
     string targetName = wShortcut.TargetPath; 
     if (targetName.Length > 0) 
     { 
      targetFile = new FileInfo(targetName); 
     } 
    } 
    catch (Exception) 
    { // will return a null targetFile if anything goes wrong 
    } 

    return targetFile; 
} 

Dieses noch nervt mich, und ich war auf der Suche diese mit etwas eleganter, zu ersetzen, sondern nur dann, wenn die Ersatz funktioniert auch mindestens so gut. Ich kann immer noch keine native C# Möglichkeit finden, das Ziel einer Verknüpfung zu finden. Gibt es einen, oder ist das immer noch der beste Weg, diese Art von Ding zu machen?

+0

Große Frage. Ich habe nicht darüber nachgedacht, wie ich das ohne COM-Interoperabilität – Sung

+0

funktionierte. Ich konnte nicht vermeiden, die Shell über nicht verwalteten Code zu verwenden, um dies leider zu erreichen. – RobS

Antwort

1

Es sieht aus wie jemand eine Klasse geschrieben hat, um Verknüpfungsdateien in C# ShellLink zu bearbeiten, aber es verwendet auch COM.

+0

Das Ausblenden der COM-Aktivität hinter einer anderen Ebene war nicht das, was ich tun wollte - ich möchte diesen Code in einem Open-Source-Projekt veröffentlichen und mochte den COM-Bashing-Teil nicht. Aber wenn es keinen anderen Weg gibt .... –

+1

Warum willst du COM nicht benutzen? Usign IShellLink ist der richtige Weg, um Dinge zu tun, da dies die API ist, die Windows für die Parsing/Modifizierung von Verknüpfungen bereitstellt. Ihr ursprünglicher Code, der Windows Scripting Host verwendete, war nicht der beste Weg, etwas zu tun, aber das lag daran, dass ein Wrapper-Objekt für Skriptsprachen verwendet wurde, nicht weil es ein COM-Objekt verwendet hatte. COM wird hinter den Kulissen die ganze Zeit auf Windows verwendet; Es ist unvermeidlich. –

1

Können Sie nicht einfach die .lnk oder .url Datei öffnen und analysieren?

Dies spricht über die gleiche Sache und zeigt, was die Dateien wie folgt aussehen: http://www.programmingtalk.com/showthread.php?t=7335

+1

Ich bin mir nicht sicher, ob das Parsen einer Datei, die keine veröffentlichte Definition hat, etwas ist, auf das ich mich in meinem Produktionscode verlassen möchte. Es gibt einen sicheren Workaround, der die COM-Schnittstelle angriff, zumindest weiß ich, dass das immer funktionieren wird. –

0

ich vor als auch eine Weile daran interessiert bekam.

Hier ist die akzeptierte response mit einem Link zu einem (informellen) description of the format von LNK-Dateien. Offenbar durchlaufen alle verfügbaren Methoden noch einige API.