2016-12-21 10 views
0

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

$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 файлов на рабочем столе с тем же именем во время тестирования, я не уверен, что это важно.

+1

Щелкните правой кнопкой мыши ярлык, сделанный программно, и сравните поля «Target» и «Start In» с вашим вручную созданным, который работает. – Quantic

+0

Возможный дубликат [Создание ярлыка файла (.lnk)] (http://stackoverflow.com/questions/18023379/creating-a-file-shortcut-lnk) –

+0

Попробуйте решение, указанное в приведенной выше ссылке. (и имейте в виду примечание относительно ссылки .NET 4.0 «WshShell» vs «WshShellClass». Решение для C#. –

ответ

0

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

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