Member 12462239 Ответов: 2

C# создание ярлыка с консольным приложением


Я хочу, чтобы мое консольное приложение C# создало ярлык самого себя?
Я не знаю с чего начать

Возможно ли это?

Что я уже пробовал:

Я не знаю, с чего начать, так как я новичок в c# и все еще учусь

2 Ответов

Рейтинг:
17

OriginalGriff

Попробовать это:

[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
    {
    }
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
    {
    void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
    void GetIDList(out IntPtr ppidl);
    void SetIDList(IntPtr pidl);
    void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
    void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
    void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
    void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
    void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
    void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
    void GetHotkey(out short pwHotkey);
    void SetHotkey(short wHotkey);
    void GetShowCmd(out int piShowCmd);
    void SetShowCmd(int iShowCmd);
    void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
    void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
    void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
    void Resolve(IntPtr hwnd, int fFlags);
    void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
    }
private void CreateLink(string pathToApplication, string description, string linkname = "MyApplication.lnk")
    {
    IShellLink shortcut = (IShellLink)new ShellLink();
    string desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    shortcut.SetDescription(description);
    shortcut.SetPath(pathToApplication);
    System.Runtime.InteropServices.ComTypes.IPersistFile f = (System.Runtime.InteropServices.ComTypes.IPersistFile) shortcut;
    f.Save(Path.Combine(desktop, linkname), false);
    }


[edit]я ненавижу разметку![/редактировать]


Member 12462239

Черт возьми, может быть, вы добавите несколько комментариев или сделаете это немного проще для понимания?

OriginalGriff

Вы шутите - это один из способов! Все, что вам нужно сделать, это вызвать CreateLink и передать ему параметры...
Все остальное-это просто координация с внешними структурами, отсюда и оформление Комимпорта...

Member 12462239

Я уже пробовал это сделать но у меня получается
Ошибка CS0120 ссылка на объект требуется для нестатического поля, метода или свойства

OriginalGriff

Поэтому сделайте метод статичным, если вы вызываете его непосредственно из main...
Кажется, что вы пытаетесь бежать, прежде чем сможете ходить - вы, вероятно, должны знать некоторые из этих вещей, если вы были на своем курсе в течение нескольких недель.

Рейтинг:
1

RajeshKumar25

Спасибо OriginalGriff.
Это прекрасно работает.

Просто улучшил метод CreateLink для лучшего удобства использования.

public static void CreateLink(String srcPath, String shortcutPath,
                              String description = null)
{
    // Derive params
    if (description == null)
        description = "Opens " + Path.GetFileNameWithoutExtension(srcPath);
    if (!shortcutPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))
        shortcutPath += ".lnk";

    // Initialize Shortcut
    var link = (IShellLink)new ShellLink();
    link.SetDescription(description);
    link.SetPath(srcPath);
    link.SetWorkingDirectory(Path.GetDirectoryName(srcPath));

    // Save
    var pf = (IPersistFile)link;
    pf.Save(shortcutPath, false);
}