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

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

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

Ответ 1

Это не так просто, как мне бы хотелось, но есть отличный вызов класса ShellLink.cs в vbAccelerator

Этот код использует interop, но не полагается на 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);
    }
}

Ответ 2

Приятный и чистый. (.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);
}

Ответ 3

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

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

Исходный код статья sorrowman "URL-ссылка на рабочий стол"

Ответ 4

Догрузить IWshRuntimeLibrary

Вам также нужно импортировать 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 icon           

    MyShortcut.IconLocation = @"D:\AZ\logo.ico";


    // Create the shortcut at the given path

    MyShortcut.Save();

}

Ответ 5

После просмотра всех возможностей, которые я нашел на 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, и просматривая его код, я считаю, что он более надежный, чем альтернативы.

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

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

Ответ 6

Как и ответ IllidanS4, используя Windows Script Host доказал самое легкое решение для меня (протестировано на 64-битной Windows 8).

Однако вместо того, чтобы импортировать тип COM вручную с помощью кода, проще просто добавить библиотеку типа COM в качестве ссылки. Выберите References->Add Reference..., COM->Type Libraries и найдите и добавьте "Windows Script Модель объекта хоста".

Это импортирует пространство имен IWshRuntimeLibrary, из которого вы можете получить доступ:

WshShell shell = new WshShell();
IWshShortcut link = (IWshShortcut)shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();

Кредит отправляется Джиму Холленхорсту.