Как создать ярлык приложения (файл .lnk) на С# или с помощью платформы .NET?
Результатом будет файл .lnk для указанного приложения или URL-адреса.
Как создать ярлык приложения (файл .lnk) на С# или с помощью платформы .NET?
Результатом будет файл .lnk для указанного приложения или URL-адреса.
Это не так просто, как мне бы хотелось, но есть отличный вызов класса 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);
}
}
Приятный и чистый. (.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();
}
}
Исходный код статья sorrowman "URL-ссылка на рабочий стол"
Вам также нужно импортировать 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();
}
После просмотра всех возможностей, которые я нашел на 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).
Как и ответ 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();