6 ответов:
Это не так просто, как хотелось бы, но это отличный класс ShellLink.cs at vbAccelerator
этот код использует взаимодействие, но не полагается на WSH.
используя этот класс, код для создания ярлыка:
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); } }
хороший и чистый. (.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); }вот и все, никакого дополнительного кода не требуется. CreateShortcut можно даже загрузить ярлык из файла, поэтому свойства, такие как TargetPath возвратить имеющуюся информацию. свойства объекта быстрого доступа.
также возможен этот способ для версий .NET, не поддерживающих динамические типы. (.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); }
Я нашел что-то вроде этого:
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(); } }исходный код статья скорбящего "url-ссылка на рабочий стол"
после изучения всех возможностей, которые я нашел, поэтому я остановился на ShellLink:
//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; ... }помимо того, что он прост и эффективен, автор (Маттиас Шегрен, MS MVP) является своего рода гуру COM/PInvoke/Interop, и, просматривая его код, я считаю, что он более надежен, чем альтернативы.
следует отметить, что файлы ярлыков также могут быть созданы несколькими утилитами командной строки (которые, в свою очередь, могут быть легко вызваны из C#/.NET). я никогда не пробовал любой из них, но я бы начал с NirCmd (У NirSoft есть SysInternals-подобные качественные инструменты).
к сожалению NirCmd не может парсить ярлык файлы (создавать их), но для этой цели TZWorks lp кажется, способны. Он даже может форматировать свой вывод в формате csv. lnk-parser выглядит тоже хорошо (он может выводить как HTML, так и CSV).
аналогично ответ IllidanS4, С помощью Windows Script Host оказалось самым простым решением для меня (протестировано на Windows 8 64 бит).
однако вместо импорта типа COM вручную с помощью кода проще просто добавить библиотеку типов COM в качестве ссылки. Выбирай
References->Add Reference...,COM->Type Librariesнайти и добавить "Объектная Модель Узла Скрипта Windows".это импортирует пространство имен
IWshRuntimeLibrary, из которых вы можете доступ:WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(LinkPathName); link.TargetPath=TargetPathName; link.Save();
вам также нужно импортировать библиотеку COM
IWshRuntimeLibrary. Щелкните правой кнопкой мыши на вашем проекте - > добавить ссылку - > COM - > IWshRuntimeLibrary - > добавить, а затем используйте следующий фрагмент кода.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(); }
Comments