2016-04-01 62 views
3

我想讓我的應用程序在桌面上創建一個快捷方式。原因是因爲我的應用程序有一些這樣的驢外部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運行良好,創建並快速發送到桌面的快捷方式也可以正常運行。

編輯:更新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

目前尚不清楚問題所在。那些依賴關係在哪裏?你如何加載它們? – Evk

+0

他們是外部dll。我通過DLLImport調用它們。有些位於應用程序位置,而其他位於同一位置的子文件夾中。 – user2530266

+0

@ user2530266我認爲,如果您手動創建快捷方式並嘗試運行它,則會產生相同的行爲。 – Valentin

回答

2

嘗試建立使用本地COM API的Windows快捷方式,在這個答案解釋:https://stackoverflow.com/a/4909475/3670737

起初,項目>添加引用> COM> Windows腳本宿主對象模型。

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(); 
} 

[編輯1]後Directory.GetCurrentDirectory()問題更新時間:

documentationThe current directory is distinct from the original directory, which is the one from which the process was started.

你預期的目錄由Directory.GetCurrentDirectory()返回的一個不同,因爲你實際上是從一個不同的啓動過程目錄時使用快捷方式(您的桌面)。 Directory.GetCurrentDirectory()返回當前工作工作目錄,如果您通過打開.exe文件啓動它,它與您的程序集是相同的,但如果從.lnk文件啓動該目錄,則是該快捷方式目錄。

在您的情況我會使用Assembly.GetExecutingAssembly().Location(檢查這個答案的詳細信息:https://stackoverflow.com/a/837501/3670737

+0

這是一個很好的解決方案。但是有一個小故障。我更新了我的第一個問題,如果你想看看 – user2530266

+0

在上次更新後編輯了答案。 –

+0

正如我所說,我當然可以調試這個問題。這就是爲什麼你的答案已被標記爲正確的;)謝謝 – user2530266

1

如果我理解正確的話,這聽起來像你可能會更好只是讓你的應用程序的安裝。你可以通過Visual Studio來做到這一點,它幾乎可以爲你自動完成這個過程。此外,您可能可以嘗試使您的程序成爲依賴關係的ClickOnce應用程序。我會親自採取後者的選擇。

我意識到這不是一個特別徹底的答案,但我覺得這個問題有點不清楚。

+0

說實話,我想過。不過,我現在要避開它。 – user2530266

相關問題