`
lindexi-gd
  • 浏览: 140123 次
社区版块
存档分类
最新评论

C#将dll打包到程序中

 
阅读更多

有时候我们会使用第三方的库,好多游戏也是使用第三方库,在没有安装第三方就会出错。

而现在我们经常使用绿色软件,希望直接运行一个软件,不要下载很多库。

我们有一个简单的方法把dll库打包程序中

我们可以添加AppDomain.CurrentDomain.AssemblyResolve在程序运行,发现缺少库

如果我们把dll放到库中,属性为资源
这里写图片描述

我看到blqw把运行从程序找dll写为

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;

namespace blqw
{
    /// <summary> 载入资源中的动态链接库(dll)文件
    /// </summary>
    static class LoadResourceDll
    {
        static Dictionary<string, Assembly> Dlls = new Dictionary<string, Assembly>();
        static Dictionary<string, object> Assemblies = new Dictionary<string, object>();

        static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
        {
            //程序集
            Assembly ass;
            //获取加载失败的程序集的全名
            var assName = new AssemblyName(args.Name).FullName;
            //判断Dlls集合中是否有已加载的同名程序集
            if (Dlls.TryGetValue(assName, out ass) && ass != null)
            {
                Dlls[assName] = null;//如果有则置空并返回
                return ass;
            }
            else
            {
                throw new DllNotFoundException(assName);//否则抛出加载失败的异常
            }
        }

        /// <summary> 注册资源中的dll
        /// </summary>
        public static void RegistDLL()
        {
            //获取调用者的程序集
            var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
            //判断程序集是否已经处理
            if (Assemblies.ContainsKey(ass.FullName))
            {
                return;
            }
            //程序集加入已处理集合
            Assemblies.Add(ass.FullName, null);
            //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的)
            AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
            //获取所有资源文件文件名
            var res = ass.GetManifestResourceNames();
            foreach (var r in res)
            {
                //如果是dll,则加载
                if (r.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
                {
                    try
                    {
                        var s = ass.GetManifestResourceStream(r);
                        var bts = new byte[s.Length];
                        s.Read(bts, 0, (int)s.Length);
                        var da = Assembly.Load(bts);
                        //判断是否已经加载
                        if (Dlls.ContainsKey(da.FullName))
                        {
                            continue;
                        }
                        Dlls[da.FullName] = da;
                    }
                    catch
                    {
                        //加载失败就算了...
                    }
                }
            }
        }
    }
}

原文:http://www.cnblogs.com/blqw/p/LoadResourceDll.html

但是这样可能存在软件无法打开,因为没有找到已加载的同名程序集,会throw new DllNotFoundException(assName)

 //判断Dlls集合中是否有已加载的同名程序集
            if (Dlls.TryGetValue(assName, out ass) && ass != null)
            {
                Dlls[assName] = null;//如果有则置空并返回
                return ass;
            }
            else
            {
                throw new DllNotFoundException(assName);//否则抛出加载失败的异常
            }

我直接注释掉,但是这样不好,现在觉得应该使用资源文件把dll放进去,判断是否有dll,没有就从资源放到同目录,然后创建快捷方式

        private void instances(string file)
        {
            debug = file;
            Uri url = new Uri(".\\" + file, UriKind.Relative);

            using (Stream stream = Application.GetResourceStream(url)?.Stream)
            {
                if (stream == null)
                {
                    return;
                }
                byte[] buffer = new byte[20480];
                int n;
                using (FileStream temp = new FileStream(file, FileMode.Create))
                {
                    while ((n = stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        temp.Write(buffer, 0, n);
                    }
                }
            }
        }
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    C#Dll打包进Exe

    C#Dll打包进Exe C#把 DLL 文件打包进 EXE 的技巧是指将原本需要单独存在的 DLL 文件整合到生成的 EXE 文件中,以便于程序的部署和运行。下面将详细介绍这项技术的实现步骤和原理。 首先,我们需要使用 Visual ...

    C#将dll打包到程序中的具体实现

    在C#编程中,将DLL打包到程序中是为了确保程序在目标环境中能够正常运行,而无需依赖外部的DLL文件。这种做法尤其适用于分发给最终用户的应用程序,因为用户可能不具备安装额外文件或管理依赖关系的能力。以下是关于...

    .Net程序压缩打包助手. 把exe和dll打包成一个文件

    综上所述,".Net程序压缩打包助手"是.NET开发者便捷的工具,它通过将exe和dll打包成一个文件,解决了程序部署中的依赖问题,提升了软件的可移植性和用户友好性。通过了解其工作原理和使用方法,开发者可以更有效地...

    C#将引用的dll嵌入到exe文件中

    在C#编程中,有时我们需要将引用的DLL文件与主执行程序(EXE)整合在一起,以便在只发布单个可执行文件的情况下运行程序。这种技术通常用于减少部署的复杂性,防止因为丢失依赖库而导致的运行错误。下面将详细解释...

    C#程序Release目录下dll文件打包工具

    C#程序中的.dll文件主要包括框架类库、自定义组件、第三方库等。打包这些文件是为了确保程序在没有相应DLL的环境中也能正常运行。 2. **打包工具**: 为了方便分发和部署,开发者需要将Release目录下的所有必要...

    手把手教你用C#打包应用程序

    在IT行业中,应用程序打包是一项重要的工作,它将开发完成的软件整理成用户友好的安装包,便于分发和安装。本教程将详细讲解如何使用C#进行应用程序打包,旨在帮助开发者掌握这一技能。 首先,我们要了解C#应用程序...

    非常好用的C#程序打包工具

    "非常好用的C#程序打包工具"标题所指的,就是一款专为C#程序设计的打包工具,它的主要功能是将C#编译后的程序集(如.exe和.dll文件)以及相关的配置文件、资源文件等整合成一个可执行的安装包,方便用户下载和安装。...

    C# 将dll文件打包进exe可执行文件中

    描述 "用C#写的,可以将dll打包到exePE文件里面执行" 提到了PE(Portable Executable)文件格式,这是Windows操作系统下可执行文件(如.exe和.dll)的标准格式。在C#中,我们可以利用.NET Framework或.NET Core的...

    C#程序(含多个Dll)合并成一个Exe的简单方法

    Fody.Costura是Fody框架的一个插件,它允许开发人员将项目所依赖的所有DLL(包括PDB调试信息文件)打包到单一的EXE文件中,使得应用程序可以在没有外部DLL的情况下运行。安装Fody.Costura非常简单,可以通过Visual ...

    c# winform 程序打包部署和VS2008制作程序安装包.docx

    C# WinForm 程序打包部署是指将 C# WinForm 应用程序转换为可执行文件并将其部署到目标机器上。为了实现这个目标,需要使用 VS2008 中的安装向导来创建一个安装项目,并将应用程序的可执行文件和相关文件添加到安装...

    将dll打包入exe

    ### 将DLL打包入EXE的关键技术点 在Windows编程中,经常需要处理动态链接库(DLL)与可执行文件(EXE)之间的交互。有时为了简化部署过程或减少依赖,开发者会选择将DLL直接嵌入到EXE文件内部。本文将深入探讨如何...

    C#桌面程序和数据库SQL Server打包方法

    在IT领域,特别是软件开发与部署过程中,将C#桌面应用程序和SQL Server数据库进行有效打包是确保应用稳定性和用户友好性的关键步骤。本文将详细解析这一过程中的核心知识点,包括但不限于利用Visual Studio .NET环境...

    多个DLL合并成一个DLL

    多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 开始-》运行 -》 "cmd" -&gt; "cd C:\Program Files\Microsoft\ILMerge" 3:) 3.1、合并file1.dll、file2.dll...

    把C#开发程序打包成绿色的exe执行文件(自解压文件)

    标题中的“把C#开发程序打包成绿色的exe执行文件(自解压文件)”指的是将C#编写的程序转换为一个独立的、无需安装即可运行的exe文件,这种文件通常被称为绿色版或便携版。这样的程序可以方便地在不同计算机上运行,...

    c#winform程序打包c#winform程序打包部署借鉴.pdf

    - 将该快捷方式分别剪切或复制到左侧的“用户的‘程序’菜单”和“用户桌面”中,这样安装完成后将在“开始”菜单和桌面上生成程序的快捷方式。 ##### 4. 设置默认安装位置 - 右击左侧的“应用程序文件夹”,打开其...

    C#应用程序的打包 生成安装文件 可执行文件

    下面将详细解释如何进行C#应用程序的打包,生成安装文件以及可执行文件。 1. **创建可执行文件(.exe)** 在Visual Studio中,当你开发完C#应用程序后,可以通过构建项目来生成可执行文件。点击“生成”菜单,选择...

    C#将dll用ILMerge捆绑入EXE

    ILMerge是一个由微软提供的工具,它能够将一个或多个.NET程序集(包括DLL和EXE)合并到一个新的单一程序集中。这样做的好处包括: 1. **简化部署**:用户只需要运行一个文件,无需担心丢失或遗漏依赖的DLL。 2. **...

    Vb.Net,C#程序如何打包

    - 打包程序可以将源代码编译为可执行文件(.exe或.dll),同时包括所有依赖项,如库、配置文件、资源等。 - 打包有助于确保目标计算机上具有运行应用程序所需的所有组件。 - 通过创建安装程序,可以简化用户的...

Global site tag (gtag.js) - Google Analytics