Создание ярлыка приложения в каталоге

Как создать ярлык приложения (файл .lnk) в C # или с помощью .NET Framework?

Результатом будет файл .lnk для указанного приложения или URL.

 Steven Jeuris09 февр. 2015 г., 19:56
Это может быть полезно:codeproject.com/Articles/3905/...

Ответы на вопрос(6)

Изучив все возможности, которые я нашел на SO, я остановился на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;
    ...
}

Помимо простоты и эффективности, автор (Mattias Sjögren, MS MVP) является своего рода гуру COM / PInvoke / Interop, и я считаю, что его код более надежен, чем альтернативы.

Следует отметить, что файлы ярлыков также могут быть созданы несколькими утилитами командной строки (которые, в свою очередь, могут быть легко вызваны из C # /. NET). Я никогда не пробовал ни одного из них, но я бы начал сNirCmd (У NirSoft есть качественные инструменты, похожие на SysInternals).

К сожалению, NirCmd не можетразбор файлы ярлыков (только создавайте их), но для этой целиTZWorks LP кажется способным Он может даже отформатировать свой вывод как CSV.LNK-анализатор выглядит хорошо (он может выводить как HTML, так и CSV).

 noonand26 янв. 2015 г., 13:09
Несколько иронично, учитывая, что ссылка содержит текст "webhost4life", но ссылка ShellLink - 404 :-(
 Ohad Schneider26 янв. 2015 г., 22:05
@noon, да, и, похоже, библиотека тоже не была кэширована на Wayback Machine. К счастью, я сохранил копию:onedrive.live.com/...

Похожий на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();

Кредит идет к Джиму Холленхорсту.

Красиво и чисто. (.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);
}

Вот и все, дополнительный код не требуется.Создать ярлык можно даже загрузить ярлык из файла, поэтому такие свойства, как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);
}
 Walter Wilfinger21 февр. 2014 г., 22:54
Это не сможет создать ярлык, имя которого содержит символы Unicode. Протестировано на Win7 с .NET 4.0. COM-объект заменяет символы Unicode на вопросительные знаки, которые недопустимы в имени файла.
 James LaPenn21 окт. 2014 г., 18:02
Спасибо, я решил использовать решение 4.0 после того, как обнаружил, что метод Shell COM имеет ограничения от моих конечных пользователей. Это привело меня кstackoverflow.com/questions/2934420/... что кратко заставляет меня думать, что у меня нет решения. Это Wsh-решение работало исключительно хорошо и было простым копированием / вставкой.
 IllidanS423 февр. 2014 г., 11:32
Ничего страшного, вы можете переименовать файл после.Save в любом случае, но спасибо за уведомление.
 Damien08 янв. 2014 г., 10:07
Очень чистый. Это будет лучший ответ, если вопрос будет задан снова.
 Justin08 сент. 2014 г., 11:40
Спасибо, я долго искал это. Больше параметров можно найти здесь:msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
Решение Вопроса

ShellLink.cs в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);
    }
}
 fparadis219 июл. 2011 г., 16:25
Работает на Windows 7 и даже в 64-битных приложениях :)
 blak3r24 июн. 2009 г., 03:25
Кто-нибудь пробовал ShellLink на Vista? Похоже, код был написан в 2003 году.
 fiberOptics19 янв. 2012 г., 14:23
У вас есть рабочий класс для этого?
 Chasler19 янв. 2012 г., 19:02
@ryan. Загрузите класс schelllink по ссылке и используйте приведенный выше код для создания ссылки. Сколько еще рабочего класса вам нужно?
 DJ Burb05 мар. 2012 г., 21:30
@Ryan - Убедитесь, что вы также получили файл FileIcon.cs .... эти два файла работают рука об руку
 Dima Kozyr19 апр. 2014 г., 20:53
Может быть, это глупый вопрос, но как добавитьShellLink проэктировать? Я скачал его и добавил в новую папкуБиблиотеки, Но в кодеиспользуя (ShellLink shortcut = new ShellLink ()) это не может найтиShellLink.
 Peter18 авг. 2012 г., 06:54
 James LaPenn21 окт. 2014 г., 18:00
Я просто хотел бы отметить, что этот метод имеет ограничения в .NET. В итоге мне пришлось использовать другой ответ ниже, который использует динамику и WSH. Кажется, проблема связана с UAC:stackoverflow.com/questions/2934420/... Таким образом, проблема в том, что интерфейс COM требует административного доступа, которого у ваших конечных пользователей может не быть. Если вы знаете, что у них есть доступ, то это не проблема. Однако в тех случаях, когда ваши пользователи не имеют прав администратора, работает подход WSH с Dyanmics, представленный ниже.
 Chasler29 февр. 2012 г., 02:36
@ryan. Мне не нужно было использовать это на карманном компьютере. Если вы найдете решение, не стесняйтесь добавить его ниже.
 David Boike07 янв. 2011 г., 20:49
Это работало на Windows Server 2008 Standard 64bit SP2. Я не вижу причин, по которым это не сработает в Vista.
 fiberOptics20 янв. 2012 г., 04:17
@Chasler Я не могу заставить его работать в Pocket-PC. Надеюсь, вы могли бы иметь версию для этого. Спасибо
 Tristan McPherson22 сент. 2014 г., 08:02
Извините за мое невежество, но просто из любопытства, что не так с WSH? Или, возможно, почему не полагаться на это плюс?
 Piero Alberto01 февр. 2016 г., 07:42
Ссылка shellLink.cs не работает

Я нашел что-то вроде этого:

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-ссылка на рабочий стол"

 aderesh16 дек. 2016 г., 21:02
Не работает в Windows 10 x64: «Цель» «этого ярлыка Интернета недействительна ...». Я создал интернет-ссылку на веб-ресурс и изменил ее на свой exe-путь в Свойства-> Веб-документ-> URL-адрес - он запускает приложение. Кроме того, я проверил формат интернет-ссылки, созданной Windows, и она отличается (например, имеет некоторое поле GUID). Таким образом, это недопустимый формат. Постскриптум В этом случае лучше использовать Uri и Uri.AbsoluteUri, а не строки.
 Helge Klein26 авг. 2011 г., 13:46
Анурадж: Вы обманываете - это создает не LNK, а файл URL.
 Frank T. Clark03 июн. 2015 г., 22:57
Это так просто. Мне все равно, что это файл .url, а не .lnk, если предположить, что он делает то же самое. Почему бы мне не использовать самое простое решение? Я проверил его для своих целей, и, кажется, работает нормально. Я считаю, что единственная строка, которая действительно нужна, это "URL =" для моих целей.
 Jeremy Thompson07 янв. 2014 г., 05:20
 chrisortman06 апр. 2011 г., 15:29
Учитывая выбор между interop / wsh или обратным инжинирингом формата файла, я бы выбрал последний. Я думаю, что вполне безопасно, что они не изменят формат в ближайшее время.

Donwload IWshRuntimeLibrary

Вам также необходимо импортировать библиотеку COMIWshRuntimeLibrary, Щелкните правой кнопкой мыши свой проект -> добавить ссылку -> 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();

}
 AZ_08 янв. 2014 г., 11:28
@Damien Есть что-то под названием Google .. LOLX: D шучу, дорогой, вы можете скачать его отсюда. Я также обновляю свой вопрос. Спасибо за указание на этоoriginaldll.com/file/interop.iwshruntimelibrary.dll/20842.html
 Damien08 янв. 2014 г., 10:10
У меня нет этой библиотеки COM на моем ПК с Windows 8.

Ваш ответ на вопрос