使用依赖项创建应用程序的快捷方式

时间:2016-04-01 18:52:08

标签: c# wpf windows shortcut

我想让我的应用在桌面上创建一个快捷方式。原因是因为我的应用程序有一些依赖,如外部dll和其他我喜欢把它放在一个文件夹中,只是在我的桌面上有一个快捷方式,而不是让我桌面上的所有文件或包含所有内容的文件夹。

这是我第一次尝试这个。我相信这很简单,如果我的问题有点不高兴,那真的很遗憾。 我的简单代码如下所示:

string checkDesktopDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
if (!File.Exists(checkDesktopDir + "\\My app.url"))
    {
        ShortCutWithDependencies("My app");
    }   
private void ShortCutWithDependencies(string sAppName)
    {
        string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

        using (StreamWriter writer = new StreamWriter(deskDir + "\\" + sAppName + ".url"))
        {
            string app = Assembly.GetExecutingAssembly().Location;
            MessageBox.Show(app);
            writer.WriteLine("[InternetShortcut]");
            writer.WriteLine("URL=" + app);
            writer.WriteLine("IconIndex=0");
            string icon = app.Replace('\\', '/');
            writer.WriteLine("IconFile=" + icon);
            writer.Flush();
        }
    }

然而,我的应用程序永远不会工作。一旦它到达该部分它将需要依赖继续它将崩溃。更具体地说,当我使用通过DLLImport导入的方法(如bass.dll方法)时,它只会崩溃。当然我在输出中看不到任何内容,因为快捷方式是编译的.exe。

所以我的问题是这个;如何创建应用程序的完整快捷方式?

编辑:更新dllimport的示例

        [DllImport("bass.dll")]
        public static extern bool BASS_Start();
        [DllImport("bass.dll")]
        public static extern bool BASS_Init(int device, uint freq, uint flag,
             IntPtr hParent, uint guid);

        if (mp3ToPlay != string.Empty)
                            {
                                BASS_Start();
                                BASS_Init(-1, 44100, 0, IntPtr.Zero, 0);
                                BassHandle = BASS_StreamCreateFile(false, mp3ToPlay, 0, 0, 0x20000);
                                BASS_ChannelPlay(BassHandle, false);
                                PlayBackLength = BASS_ChannelGetLength(BassHandle, 0);
                                PlayBack = true;
                            }

现在我相信这就是问题所在。我不确定。外部dll(bass.dll,Newtonsoft.Json.dll和Spotify.dll)将Copy to output directory设置为Copy always并复制它们。 .exe运行正常,创建快捷方式并手动发送到桌面也可以正常运行。

编辑:用Federico的例子更新2 现在这将有效:

private void CreateShortcut()
        {
            object shDesktop = "Desktop";
            WshShell shell = new WshShell();
            string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\iBlock.lnk";
            IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress);
            shortcut.Description = "New shortcut for a iBlock";
            shortcut.Hotkey = "Ctrl+Shift+N";
            shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\iBlock\iBlock.exe";
            shortcut.Save();
        }

然而这里有一个小故障。 这部分代码

public string mp3Path = Directory.GetCurrentDirectory() + "\\mp3Directory";

if (!System.IO.File.Exists(mp3Path))
            {
                Directory.CreateDirectory(mp3Path);
            }

将其更改为AppDomain.CurrentDomain.BaseDirectory可以轻松修复它。

2 个答案:

答案 0 :(得分:2)

尝试使用本机COM Windows API创建快捷方式,如本答案中所述:https://stackoverflow.com/a/4909475/3670737

  

首先,项目>添加参考> COM> Windows脚本宿主对象模型。

ValueError: too many values to unpack

[编辑1] using IWshRuntimeLibrary; private void CreateShortcut() { object shDesktop = (object)"Desktop"; WshShell shell = new WshShell(); string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Notepad.lnk"; IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); shortcut.Description = "New shortcut for a Notepad"; shortcut.Hotkey = "Ctrl+Shift+N"; shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolders.System) + @"\notepad.exe"; shortcut.Save(); } 问题后更新:

来自documentationDirectory.GetCurrentDirectory()

您的预期目录与The current directory is distinct from the original directory, which is the one from which the process was started.返回的目录不同,因为当您使用快捷方式(桌面)时,实际上是从不同的目录启动进程。 Directory.GetCurrentDirectory()返回当前工作目录,如果通过打开.exe文件启动它,则与程序集相同,但如果从.lnk文件启动它,则该目录是快捷方式目录

在您的方案中,我使用Directory.GetCurrentDirectory()(查看此答案以获取更多信息:https://stackoverflow.com/a/837501/3670737

答案 1 :(得分:1)

如果我理解正确,听起来你可能最好只为你的应用程序制作一个安装程序。您可以通过Visual Studio执行此操作,它可以为您自动完成该过程。此外,您可以尝试使您的程序成为具有依赖项的ClickOnce应用程序。我个人采取后一种选择。

我意识到这不是一个特别彻底的答案,但我觉得这个问题有点不清楚。