Ярлыки Windows, созданные программно, не работают

Я использовал C# и Powershell для создания ярлыков, но когда они создаются в коде, они не работают. Я нажимаю на ярлык, курсор показывает, что ПК думает секунду, а затем ничего не происходит. Это код Powershell, который я использовал:

$currPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
$tgtPath = ($currPath + "\bin\MyApp.exe")
$scutPath = ([Environment]::GetFolderPath("Desktop") + "\MyApp.lnk")
$wShell = New-Object -ComObject WScript.Shell
$scut = $wShell.CreateShortcut($scutPath)
$scut.TargetPath = $tgtPath
$scut.Save()

Код C# делает то же самое, используя библиотеку IWshRuntimeLibrary. Этот небольшой скрипт просто создает ярлык на чьем-то рабочем столе после того, как он загрузил мой небольшой автономный исполняемый файл. Я могу вручную создать ярлык, и все работает нормально. Почему я не могу сделать это через код?

Я создал несколько ярлыков и файлов .url на рабочем столе с тем же именем в ходе тестирования, я не уверен, что это имеет значение.


person Ian    schedule 21.12.2016    source источник
comment
Щелкните правой кнопкой мыши ярлык, созданный программно, и сравните поля «Цель» и «Начать с» с созданным вручную, который работает.   -  person Quantic    schedule 22.12.2016
comment
Возможный дубликат создания ярлыка файла (.lnk)   -  person Kraang Prime    schedule 22.12.2016
comment
Попробуйте решение, указанное в приведенной выше ссылке. (и имейте в виду примечание относительно ссылки на .NET 4.0 WshShell против WshShellClass. Решение предназначено для С#.   -  person Kraang Prime    schedule 22.12.2016
comment
@Quantic - Совершенно верно. Раньше я тщательно сравнивал свойства, но упустил из виду начало в поле. Поместите это как ответ, и я могу принять его. Свойство, которое необходимо установить, — это рабочий каталог объекта ярлыка.   -  person Ian    schedule 22.12.2016


Ответы (1)


Часто вам нужно убедиться, что WorkingDirectory назначается, иначе Environment.CurrentDirectory вашей программы унаследует каталог, из которого вы вызвали ярлык. Ваша программа, вероятно, закрывается из-за того, что не находит ресурс с использованием относительного пути, например значка: _notifyIcon.Icon = new System.Drawing.Icon(@"Resources\Icons\myicon.ico"); произойдет сбой при использовании ярлыка с пустым WorkingDirectory, когда ярлык запускается из процесса с другим рабочим каталогом, чем в том, где находится ваш файл . exe (например, процесс Explorer, который читает ваш ярлык и запускает вашу программу, когда вы дважды щелкаете по ярлыку).

Вы можете проверить, во что расширяется относительный путь, используя Path.GetFullPath(string relativePath), и вы можете увидеть текущий каталог с помощью Environment.CurrentDirectory. Запуская ярлык с рабочего стола без набора Start In, я вижу рабочий каталог как мой рабочий стол, что означает, что @"Resources\Icons\myicon.ico" будет расширен до @"C:\Users\me\Desktop\Resources\Icons\myicon.ico, что нехорошо, поскольку значок находится где-то еще, например, @"C:\Program Files\MyProgram\Resources\Icons\myicon.ico".

person Quantic    schedule 21.12.2016