2013-04-26 72 views
0

如果您觀察以下圖片,我的'RSR.exe'應用程序運行良好,因爲這兩個.dll文件位於相同的文件路徑上;但是,如果這些.dll文件與RSR.exe不在同一文件路徑/目錄中,將導致崩潰/'程序已停止工作'。運行時參考.dlls?

READ ABOVE COMMENT

這裏是下面的代碼塊,我想沒有成功使用。

public static MainForm _mainForm; 

    static string subPath = @"C:\Users\Public\Documents\RSR"; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     if (!Directory.Exists(subPath)) 
     { 
      Directory.CreateDirectory(subPath); 

      if (IntPtr.Size == 4) 
      { 
       File.WriteAllBytes("C:\\Users\\Public\\Documents\\RSR\\MouseKeyboardActivityMonitor.dll", Properties.Resources.MouseKeyboardActivityMonitor); 

       File.WriteAllBytes("C:\\Users\\Public\\Documents\\RSR\\WindowsFormsAero.dll", Properties.Resources.WindowsFormsAero); 
      } 
      else 
      { 
       File.WriteAllBytes("C:\\Users\\Public\\Documents\\RSR\\MouseKeyboardActivityMonitor.dll", Properties.Resources.MouseKeyboardActivityMonitor1); 

       File.WriteAllBytes("C:\\Users\\Public\\Documents\\RSR\\WindowsFormsAero.dll", Properties.Resources.WindowsFormsAero); 
      } 
     } 

     AssemblyName asm1 = AssemblyName.GetAssemblyName(@"C:\Users\Public\Documents\RSR\MouseKeyboardActivityMonitor.dll"); 
     Assembly.Load(asm1); 

     AssemblyName asm2 = AssemblyName.GetAssemblyName(@"C:\Users\Public\Documents\RSR\WindowsFormsAero.dll"); 
     Assembly.Load(asm2); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (_mainForm = new MainForm()) 
     { 
      Application.Run(_mainForm); 
     } 

     Cursor normalCursor1 = new Cursor(new System.IO.MemoryStream(Properties.Resources.cursor_normal)); 
     SetSystemCursor(normalCursor1.Handle, 32512); 
    } 

下面是當2 .dlls不在同一目錄/路徑中時的崩潰信息的圖片。

READ COMMENT ABOVE

任何援助將不勝感激。

謝謝。

+3

您有硬編碼路徑指向您的桌面;當然,如果dll在那裏丟失,它會崩潰。你爲什麼不直接引用它們作爲你的解決方案中的「添加引用...」。不應該使用Assembly.Load。 – loopedcode 2013-04-26 02:15:22

+0

如果您必須使用嵌入式資源DLL,則可以使用我發佈的答案。 – loopedcode 2013-04-26 02:25:27

+0

爲什麼在這個世界上你不能只用你的可執行文件分發這些DLL?爲什麼你需要嵌入它們?這將導致病毒掃描程序和安全策略出現各種問題。用戶不應該擁有對app目錄的寫入權限。 – 2013-04-26 05:05:40

回答

2

如果您必須將DLL打包爲嵌入式資源,則可以通過動態裝配解析來加載它。您的代碼也必須運行加載權限。

public static MainForm _mainForm; 
{ 
    //Add this in your main initialization 
    AppDomain.CurrentDomain.AssemblyResolve+=new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
} 

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    if (args.Name.Contains("FullNameSpace.MouseKeyboardActivityMonitor")) 
    { 
     return Assembly.Load(Properties.Resources.MouseKeyboardActivityMonitor); 
    } 

    if (args.Name.Contains("FullNameSpace.MouseKeyboardActivityMonitor")) 
    { 
     return Assembly.Load(Properties.Resources.WindowsFormsAero); 
    } 

    return null; 
} 
+0

我無法嵌入這些.dlls,持久性選項被鎖定爲'在編譯時鏈接'。 – Andrew 2013-04-26 02:27:46

+0

您不是已經將它嵌入:Properties.Resources.WindowsFormsAero – loopedcode 2013-04-26 02:28:49

+0

崩潰仍然發生;無法加載文件或程序集'WindowsFormsAero,Version = 1.5.0.0,Culture = neutral,PublicKeyToken = null'或其某個依賴項。該系統找不到指定的文件。 – Andrew 2013-04-26 02:35:26