我想让我的应用在桌面上创建一个快捷方式。原因是因为我的应用程序有一些依赖,如外部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
可以轻松修复它。
答案 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();
}
问题后更新:
来自documentation:Directory.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应用程序。我个人采取后一种选择。
我意识到这不是一个特别彻底的答案,但我觉得这个问题有点不清楚。