Вопрос по c#, shortcut, .net, file-io – Создание ярлыка приложения в каталоге

70

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

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

Это может быть полезно:codeproject.com/Articles/3905/... Steven Jeuris

Ваш Ответ

6   ответов
1

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

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

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

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

48

Красиво и чисто. (.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);
}
Спасибо, я долго искал это. Больше параметров можно найти здесь:msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx Justin
Ничего страшного, вы можете переименовать файл после.Save в любом случае, но спасибо за уведомление. IllidanS4
Очень чистый. Это будет лучший ответ, если вопрос будет задан снова. Damien
Это не сможет создать ярлык, имя которого содержит символы Unicode. Протестировано на Win7 с .NET 4.0. COM-объект заменяет символы Unicode на вопросительные знаки, которые недопустимы в имени файла. Walter Wilfinger
Спасибо, я решил использовать решение 4.0 после того, как обнаружил, что метод Shell COM имеет ограничения от моих конечных пользователей. Это привело меня кstackoverflow.com/questions/2934420/... что кратко заставляет меня думать, что у меня нет решения. Это Wsh-решение работало исключительно хорошо и было простым копированием / вставкой. James LaPenn
61

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);
    }
}
@ryan. Загрузите класс schelllink по ссылке и используйте приведенный выше код для создания ссылки. Сколько еще рабочего класса вам нужно? Chasler
Кто-нибудь пробовал ShellLink на Vista? Похоже, код был написан в 2003 году. blak3r
@Chasler Я не могу заставить его работать в Pocket-PC. Надеюсь, вы могли бы иметь версию для этого. Спасибо fiberOptics
Извините за мое невежество, но просто из любопытства, что не так с WSH? Или, возможно, почему не полагаться на это плюс? Tristan McPherson
14

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

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

Не работает в Windows 10 x64: «Цель» «этого ярлыка Интернета недействительна ...». Я создал интернет-ссылку на веб-ресурс и изменил ее на свой exe-путь в Свойства-> Веб-документ-> URL-адрес - он запускает приложение. Кроме того, я проверил формат интернет-ссылки, созданной Windows, и она отличается (например, имеет некоторое поле GUID). Таким образом, это недопустимый формат. Постскриптум В этом случае лучше использовать Uri и Uri.AbsoluteUri, а не строки. aderesh
Учитывая выбор между interop / wsh или обратным инжинирингом формата файла, я бы выбрал последний. Я думаю, что вполне безопасно, что они не изменят формат в ближайшее время. chrisortman
Анурадж: Вы обманываете - это создает не LNK, а файл URL. Helge Klein
Это так просто. Мне все равно, что это файл .url, а не .lnk, если предположить, что он делает то же самое. Почему бы мне не использовать самое простое решение? Я проверил его для своих целей, и, кажется, работает нормально. Я считаю, что единственная строка, которая действительно нужна, это "URL =" для моих целей. Frank T. Clark
1

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();

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

Похожие вопросы