2013-04-26 70 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