Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时上的Reference.dll?_C#_.net_Winforms_Reference - Fatal编程技术网

C# 运行时上的Reference.dll?

C# 运行时上的Reference.dll?,c#,.net,winforms,reference,C#,.net,Winforms,Reference,如果您观察下图,我的'RSR.exe'应用程序运行良好,因为两个.dll位于同一文件路径上;但是,如果这些2.dll与RSR.exe不在同一文件路径/目录中,则会导致崩溃/“程序已停止工作” 下面是我尝试使用的代码,但没有成功 public static MainForm _mainForm; static string subPath = @"C:\Users\Public\Documents\RSR"; /// <summary>

如果您观察下图,我的'RSR.exe'应用程序运行良好,因为两个.dll位于同一文件路径上;但是,如果这些2.dll与RSR.exe不在同一文件路径/目录中,则会导致崩溃/“程序已停止工作”

下面是我尝试使用的代码,但没有成功

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);
    }
publicstaticmainform\u MainForm;
静态字符串子路径=@“C:\Users\Public\Documents\RSR”;
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
如果(!Directory.Exists(子路径))
{
CreateDirectory(子路径);
如果(IntPtr.Size==4)
{
文件.writealBytes(“C:\\Users\\Public\\Documents\\RSR\\MouseKeyboardActivityMonitor.dll”,Properties.Resources.MouseKeyboardActivityMonitor);
文件.writealBytes(“C:\\Users\\Public\\Documents\\RSR\\WindowsFormsAero.dll”,Properties.Resources.WindowsFormsAero);
}
其他的
{
文件.writealBytes(“C:\\Users\\Public\\Documents\\RSR\\MouseKeyboardActivityMonitor.dll”,Properties.Resources.MouseKeyboardActivityMonitor1);
文件.writealBytes(“C:\\Users\\Public\\Documents\\RSR\\WindowsFormsAero.dll”,Properties.Resources.WindowsFormsAero);
}
}
AssemblyName asm1=AssemblyName.GetAssemblyName(@“C:\Users\Public\Documents\RSR\MouseKeyboardActivityMonitor.dll”);
总成载荷(asm1);
AssemblyName asm2=AssemblyName.GetAssemblyName(@“C:\Users\Public\Documents\RSR\WindowsFormsAero.dll”);
总成载荷(asm2);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
使用(_mainForm=new mainForm())
{
Application.Run(_mainForm);
}
游标normalCursor1=新游标(new System.IO.MemoryStream(Properties.Resources.Cursor_normal));
设置系统光标(normalCursor1.Handle,32512);
}
下面是当2.dll不在同一目录/路径中时崩溃信息的图片

任何协助都将不胜感激


谢谢。

如果您必须将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;
}

您有指向桌面的硬编码路径;当然,如果DLL在那里丢失,它将崩溃。为什么不在解决方案中将它们直接引用为“添加引用…”。不应该使用Assembly.Load。如果必须使用嵌入式资源DLL,您可以使用我发布的答案。为什么您不能将DLL与可执行文件一起分发?为什么需要嵌入它们?这将导致病毒扫描程序和安全策略出现各种各样的问题。用户不应具有对应用程序目录的写入权限。我无法嵌入这些。DLL,持久性选项已锁定为“在编译时链接”。您是否已将其嵌入:Properties.Resources.windowsformsaero崩溃仍在发生;无法加载文件或程序集“WindowsFormsAero,版本=1.5.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。您的命名空间必须匹配。在CurrentDomain_AssemblyResolve上放置断点,并找出为该程序集请求的命名空间。这是断点信息;这就是我的资源的样子;