C# 运行时上的Reference.dll?
如果您观察下图,我的'RSR.exe'应用程序运行良好,因为两个.dll位于同一文件路径上;但是,如果这些2.dll与RSR.exe不在同一文件路径/目录中,则会导致崩溃/“程序已停止工作” 下面是我尝试使用的代码,但没有成功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>
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上放置断点,并找出为该程序集请求的命名空间。这是断点信息;这就是我的资源的样子;