Wie erstellen Sie eine Anwendungsverknüpfung (.lnk-Datei) in C # oder mit .NET Framework?
Das Ergebnis wäre eine .lnk-Datei für die angegebene Anwendung oder URL.
Es ist nicht so einfach, wie ich es gerne gehabt hätte, aber es gibt einen tollen Klassenaufruf ShellLink.cs at vbAccelerator
Dieser Code verwendet interop, ist jedoch nicht auf WSH angewiesen.
Mit dieser Klasse lautet der Code zum Erstellen der Verknüpfung:
private static void configStep_addShortcutToStartupGroup()
{
using (ShellLink shortcut = new ShellLink())
{
shortcut.Target = Application.ExecutablePath;
shortcut.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
shortcut.Description = "My Shorcut Name Here";
shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
shortcut.Save(STARTUP_SHORTCUT_FILEPATH);
}
}
Schön und sauber. (. NET 4.0 )
Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
dynamic Shell = Activator.CreateInstance(t);
try{
var lnk = Shell.CreateShortcut("sc.lnk");
try{
lnk.TargetPath = @"C:\something";
lnk.IconLocation = "Shell32.dll, 1";
lnk.Save();
}finally{
Marshal.FinalReleaseComObject(lnk);
}
}finally{
Marshal.FinalReleaseComObject(Shell);
}
Es wird kein zusätzlicher Code benötigt. CreateShortcut kann sogar Verknüpfungen aus Dateien laden, sodass Eigenschaften wie TargetPath vorhandene Informationen zurückgeben. Shortcut-Objekteigenschaften .
Dies ist auch für .NET-Versionen möglich, die keine dynamischen Typen unterstützen. (. NET 3.5 )
Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
object Shell = Activator.CreateInstance(t);
try{
object lnk = t.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, Shell, new object[]{"sc.lnk"});
try{
t.InvokeMember("TargetPath", BindingFlags.SetProperty, null, lnk, new object[]{@"C:\whatever"});
t.InvokeMember("IconLocation", BindingFlags.SetProperty, null, lnk, new object[]{"Shell32.dll, 5"});
t.InvokeMember("Save", BindingFlags.InvokeMethod, null, lnk, null);
}finally{
Marshal.FinalReleaseComObject(lnk);
}
}finally{
Marshal.FinalReleaseComObject(Shell);
}
Ich habe so etwas gefunden:
private void appShortcutToDesktop(string linkName)
{
string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url"))
{
string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
writer.WriteLine("[InternetShortcut]");
writer.WriteLine("URL=file:///" + app);
writer.WriteLine("IconIndex=0");
string icon = app.Replace('\\', '/');
writer.WriteLine("IconFile=" + icon);
writer.Flush();
}
}
Ursprünglicher Code unter Sorrowmans Artikel "url-link-to-desktop"
Ähnlich wie bei IllidanS4s Antwort erwies sich die Verwendung von Windows Script Host für mich als die einfachste Lösung (getestet unter Windows 8 64 Bit).
Anstatt den COM-Typ manuell über Code zu importieren, ist es einfacher, die COM-Typbibliothek als Referenz hinzuzufügen. Wählen References->Add Reference...
, COM->Type Libraries
und suchen und fügen Sie "Windows Script Host Object Model" hinzu.
Dadurch wird der Namespace IWshRuntimeLibrary
importiert, von dem aus Sie auf Folgendes zugreifen können:
WshShell Shell = new WshShell();
IWshShortcut link = (IWshShortcut)Shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();
IWshRuntimeLibrary herunterladen
Sie müssen auch die COM-Bibliothek IWshRuntimeLibrary
importieren. Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Verweis hinzufügen -> COM -> IWshRuntimeLibrary -> Hinzufügen und verwenden Sie dann den folgenden Codeausschnitt.
private void createShortcutOnDesktop(String executablePath)
{
// Create a new instance of WshShellClass
WshShell lib = new WshShellClass();
// Create the shortcut
IWshRuntimeLibrary.IWshShortcut MyShortcut;
// Choose the path for the shortcut
string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
MyShortcut = (IWshRuntimeLibrary.IWshShortcut)lib.CreateShortcut(@deskDir+"\\AZ.lnk");
// Where the shortcut should point to
//MyShortcut.TargetPath = Application.ExecutablePath;
MyShortcut.TargetPath = @executablePath;
// Description for the shortcut
MyShortcut.Description = "Launch AZ Client";
StreamWriter writer = new StreamWriter(@"D:\AZ\logo.ico");
Properties.Resources.system.Save(writer.BaseStream);
writer.Flush();
writer.Close();
// Location for the shortcut's icon
MyShortcut.IconLocation = @"D:\AZ\logo.ico";
// Create the shortcut at the given path
MyShortcut.Save();
}
Nachdem ich alle Möglichkeiten durchgesehen hatte, die ich bei SO Ich habe mich für ShellLink entschieden:
//Create new shortcut
using (var shellShortcut = new ShellShortcut(newShortcutPath)
{
Path = path
WorkingDirectory = workingDir,
Arguments = args,
IconPath = iconPath,
IconIndex = iconIndex,
Description = description,
})
{
shellShortcut.Save();
}
//Read existing shortcut
using (var shellShortcut = new ShellShortcut(existingShortcut))
{
path = shellShortcut.Path;
args = shellShortcut.Arguments;
workingDir = shellShortcut.WorkingDirectory;
...
}
Der Autor (Mattias Sjögren, MS MVP) ist nicht nur einfach und effektiv, sondern auch eine Art COM/PInvoke/Interop-Guru.
Es sollte erwähnt werden, dass Verknüpfungsdateien auch von mehreren Befehlszeilendienstprogrammen erstellt werden können (die wiederum einfach über C # /. NET aufgerufen werden können). Ich habe noch nie einen von ihnen ausprobiert, aber ich würde mit NirCmd (NirSoft hat SysInternals-ähnliche Qualitätswerkzeuge) beginnen.
Leider kann NirCmd keine Verknüpfungsdateien analysieren (nur erstellen), aber zu diesem Zweck scheint TZWorks lp in der Lage zu sein. Es kann sogar die Ausgabe als csv formatieren. lnk-parser sieht auch gut aus (es kann sowohl HTML als auch CSV ausgeben).