从资源加载dll库到当前域(在主exe文件中嵌入dll)

2023-12-01

我尝试使用以下代码在运行时加载 dll 库,这样我就不必向用户提供大量 dll 文件以及主可执行文件。我已将所有 dll 文件作为嵌入式资源包含在内,并且在参考部分中我已包含它们并设置了复制本地属性为 false。但这里的问题是:
1.所有dll都被复制到Bin\Debug文件夹中
2.我得到了文件未找到异常.
我做了很多搜索来解决这些问题,最后我在这里。我有一个类似的代码here但还是无能为力。我应该怎么做才能防止这种异常......? 有没有更好的方法来为一个人做同样的事情Windows 窗体应用程序(非 WPF)...??

using System;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Collections.Generic;
using System.IO;

namespace MyNameSpace
{
    static class Program
    {
        static int cnt;
        static IDictionary<string, Assembly> assemblyDictionary;
        [STAThread]
        static void Main()
        {
            AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
            if (cnt != 1)
            {
                cnt = 1;
                Assembly executingAssembly = Assembly.GetExecutingAssembly();
                string[] resources = executingAssembly.GetManifestResourceNames();
                foreach (string resource in resources)
                {
                    if (resource.EndsWith(".dll"))
                    {
                        using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
                        {
                            if (stream == null)
                                continue;

                            byte[] assemblyRawBytes = new byte[stream.Length];
                            stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
                            try
                            {
                                assemblyDictionary.Add(resource, Assembly.Load(assemblyRawBytes));
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show("Failed to load: " + resource + " Exception: " + ex.Message);
                            }
                        }
                    }
                }
                Program.Main();
            }
            if (cnt == 1)
            {
                cnt = 2;
                System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
        }

        private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
        {            
            AssemblyName assemblyName = new AssemblyName(args.Name);

            string path = assemblyName.Name + ".dll";

            if (assemblyDictionary.ContainsKey(path))
            {
                return assemblyDictionary[path];
            }
            return null;
        }
    }
}

如果我在代码中使用了不必要的东西,那么你可以告诉我正确的方法...... 我是一名学生,正在从事Windows 窗体应用程序 v4.0我要提交的论文项目。


如果您的情况仍然如此must执行此操作,然后使用此 OnResolveAssembly 方法。如果您不愿意,则无​​需将它们预加载到数组中。这将在第一次实际需要时加载它们。

然后只需:

  • add the 一些程序集.dll文件到项目中。
    • 可能不是对项目输出的引用
    • 但该文件是 DLL 项目的结果。
  • 将其标记为Resource在文件属性中。

    // This function is not called if the Assembly is already previously loaded into memory.
    // This function is not called if the Assembly is already in the same folder as the app.
    //
    private static Assembly OnResolveAssembly(object sender, ResolveEventArgs e)
    {
        var thisAssembly = Assembly.GetExecutingAssembly();
    
        // Get the Name of the AssemblyFile
        var assemblyName = new AssemblyName(e.Name);
        var dllName = assemblyName.Name + ".dll";
    
        // Load from Embedded Resources
        var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
        if (resources.Any())
        {
            // 99% of cases will only have one matching item, but if you don't,
            // you will have to change the logic to handle those cases.
            var resourceName = resources.First();
            using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null) return null;
                var block = new byte[stream.Length];
    
                // Safely try to load the assembly.
                try
                {
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
                catch (IOException)
                {
                    return null;
                }
                catch (BadImageFormatException)
                {
                    return null;
                }
            }
        }
    
        // in the case the resource doesn't exist, return null.
        return null;
    }
    

-Jesse

PS:这个来自http://www.paulrohde.com/merging-a-wpf-application-into-a-single-exe/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从资源加载dll库到当前域(在主exe文件中嵌入dll) 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • 如何将相似名称的文件复制到文件夹中?

    我正在创建一个归档系统 需要将文件分类到文件夹中 我通过在 Excel 工作表中提及文件夹名称来自动创建文件夹 现在我需要复制相应文件夹中具有相似名称的文件 例如 将创建一个名为 Ashley Davidson 的文件夹 一个源文件夹中且文
  • 如何为 php Web 应用程序管理不同国家/地区的不同用户的时区?

    我正在开发网络应用程序 该应用程序有来自不同国家的不同用户 我曾经使用 UTC 时间戳来管理他们的注册 这对我来说可以 但是当我检查帐户的到期日期时出现问题 例如 假设注册有效期为 15 天 来自印度的用户 其注册日期为亚洲 加尔各答时区的
  • html lang 属性的 html 验证错误

    我收到此错误消息 该文档似乎是 Lorem ipsum 文本 但 html 开始标记有 lang en 考虑使用 lang zxx 或变体 从第 5 行第 32 列开始 至第 5 行 第 47 列 html lang en 如需进一步指导
  • Magento simplexml_load_string()错误位置

    我有一个非常烦人的问题 当我对 Magento 商店进行一些修改时 我遇到了 simplexml load string 错误 我很清楚这个错误是由一些错误的 XML 文件引起的 但对我来说非常重要的问题是哪个文件以及它位于哪里 这是我收到
  • 使用RxJava 2和Retrofit 2,适配器版本问题

    我在 Android Studio 中的现有应用程序模块中添加了一个新的库模块 主要区别是添加了 RxJava 2 和 Retrofit 2 更新新模块的 build gradle 后 我开始收到下一个错误 错误 任务 app transf
  • 对象数组中属性值的递归数组

    我需要的是一个属性值数组 从对象数组中递归收集 这就是我的意思 const regions name Europe subRegions name BeNeLux territories code NL name Netherlands c
  • 如何在 Fortran 中正确地终结对象?

    我有一个解析文本文件的对象 这是我的主要程序 program main use Parser class implicit none type Parser Parser call Parser ProcessFile data txt c
  • 如何在应用程序中获取 Dart 和 Flutter 版本

    How to log 的版本Dart and Flutter在应用程序内 like String dartVersion log dart dartVersion 要执行 dart 版本 您可以使用 Platform 类直接返回 dart
  • 如何在GWT页面中显示java小程序?

    我可能在这里遗漏了一些简单的东西 但我在其他地方找不到答案 我只想在我的 GWT 代码中显示一个小程序 操作系统 Windows XP Java JDK 1 6 0 10 其他 GWT GWT Ext 2 0 5 这是小程序 显然是为了测试
  • 我正在尝试使用命令 sudo npm install --g expo-cli 请注意我尝试 --force 全局重新安装 expo-cli 软件包

    bosshoc MBP de BOSS meals app sudo npm install g expo cli Password npm ERR code ENOTEMPTY npm ERR syscall rename npm ERR
  • Android WebView - 拦截点击

    我编写了一个带有 WebView 的简单 helloworld 应用程序 该应用程序在我的 asset 文件夹中的 simple html 页面上有 CNN 的链接 a href http cnn com cnn com a 如何捕获对我的
  • 合并两个都有联结表的 SQLite 数据库

    我有两个 SQLite 数据库 它们都有连接表来描述一对多关系 现在 这两个数据库需要通过某种导入 导出机制合并为一个数据库 并仍然保留关系 我试图转储DB2 with dump然后将其加载回DB1 with read 但总是得到PRIMA
  • 如何制作克隆或扩展模式

    我有多个显示器 虚拟 真实 默认情况下我想从我的程序将其置于克隆 双模式 有人可以建议我如何实现这一目标吗 我对这个世界很陌生 对于这个基本问题感到抱歉 即使任何文档或任何链接都将非常值得赞赏 萨博吉特 Extend SetDisplayC
  • MSP430G2553 定时器间隔 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 在阅读了大约五遍文字并进行谷歌搜索后 我决定寻求帮助 我目前正在使用 Timer A 中断以 1 秒 10 秒 1 分钟的间隔一次打开 关闭两个 LED 默认程序每秒都会打开 关闭 L
  • 我可以阻止特定数据成员被反序列化吗?

    我有这样的数据合同 DataContract class MyDC DataMember public string DM1 DataMember public string DM2 DataMember public string DM3
  • QTP 中的 RO 属性和 TO 属性有什么区别?

    在QTP中每个测试对象都支持以下方法 GetRoProperty GetToProperty SetToProperty GetToProperties 和有什么区别RO 财产和TO property 为什么我只能设置一个TO 财产而不是R
  • 如果 id 匹配,则从 mysql 选择行

    我想从 mysql 中选择与特定 id 匹配的行 我想获取ID是否匹配的结果 如果数据库中不存在该ID 则不应该执行任何操作 我这样运行 q SELECT FROM entries where id 1 result mysql query
  • Visual Studio 2017 - Git 因致命错误而失败

    我使用的是 Visual Studio 2017 Community Edition CE 并且已登录我的 Microsoft 帐户并连接到 VSTS 我可以看到我的所有项目和存储库 但是当我尝试拉 取 推送任何更改时 我收到以下错误 Er
  • 设置包括 Wamp 上 PEAR 的路径

    安装 PEAR 并按照上的说明进行操作http www phpunit de manual current en installation html pear config set auto discover 1 pear install
  • 从资源加载dll库到当前域(在主exe文件中嵌入dll)

    我尝试使用以下代码在运行时加载 dll 库 这样我就不必向用户提供大量 dll 文件以及主可执行文件 我已将所有 dll 文件作为嵌入式资源包含在内 并且在参考部分中我已包含它们并设置了复制本地属性为 false 但这里的问题是 1 所有d