C# dll嵌入exe中的方法

这篇博客介绍了如何在Visual Studio 2008中使用.NET 3.5将DLL库嵌入到EXE应用程序中,主要参考了两个资源链接,提供了在项目中添加现有项以及在Main函数前添加特定函数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢http://www.crifan.com/csharp_integrate_dll_library_into_exe_application/

和 http://www.cnblogs.com/kui2/archive/2012/11/29/embedded-dll.html

对于vs2008 使用.net3.5的情况,可以直接在项目上添加现用项,Main函数最前添加以下函数

    //格式1
    //!!! for load embedded dll: (2) implement this handler
    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");

        dllName = dllName.Replace(".", "_");

        if (dllName.EndsWith("_resources")) return null;

        System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

        byte[] bytes = (byte[])rm.GetObject(dllName);

        return System.Reflection.Assembly.Load(bytes);
    }
    
    //格式2
        // 框架加载dll失败后执行,手动加载dll
    AppDomain.CurrentDomain.AssemblyResolve += (sender, senderArgs) =>
    {
        // 当前程序集
        var executingAssembly = Assembly.GetExecutingAssembly();
        // 当前程序集名称
        var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
        // dll名称
        var dllName = new AssemblyName(senderArgs.Name).Name;
        // 待加载dll路径,指向当前程序集资源文件中dll路径。* 根据程序结构调整,使其正确指向dll
        var dllUri = assemblyName + "." + dllName + ".dll";
        // 加载dll
        using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
        {
            var assemblyData = new Byte[resourceStream.Length];
            resourceStream.Read(assemblyData, 0, assemblyData.Length);
            //return Assembly.Load(assemblyData); //加载dll
            var valrt = Assembly.Load(assemblyData); //加载dll
            return valrt;
        }
    };

另外可以把dll都放到一个文件夹里,然后添加引用,并设置属性为"嵌入的资源"
改好的代码备份一下


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

namespace TestSystem
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (!ImportDLL())
            {
                MessageBox.Show("DLL import error!");
                return;
            }

            //也可以直接在这里这样写
//             AppDomain.CurrentDomain.AssemblyResolve += (sender, senderargs) =>
//             {
//                 var executingAssembly = Assembly.GetExecutingAssembly();
//                 var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
//                 var dllName = new AssemblyName(senderargs.Name).Name;
//                 var dllUri = assemblyName + ".reference." + dllName + ".dll";
// //                var dllUri = assemblyName + "." + dllName + ".dll";
//                 using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
//                 {
//                     var assemblyData = new Byte[resourceStream.Length];
//                     resourceStream.Read(assemblyData, 0, assemblyData.Length);
//                     return Assembly.Load(assemblyData); //加载dll
//                 }
//             };
            //这种方法测试一直没成功,没找到原因 还不是很懂
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
          //  Application.Run(new TestSystemForm());
            Application.Run(new MFrom());
        }
        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
  
            dllName = dllName.Replace(".", "_");
  
            if (dllName.EndsWith("_resources")) return null;
            object localobj=new object();
  
            System.Resources.ResourceManager rm = new System.Resources.ResourceManager(localobj.GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
  
            byte[] bytes = (byte[])rm.GetObject(dllName);
  
            return System.Reflection.Assembly.Load(bytes);
        }
        static bool ImportDLL()
        {
            try
            {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, senderargs) =>
            {
                var executingAssembly = Assembly.GetExecutingAssembly();
                var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
                var dllName = new AssemblyName(senderargs.Name).Name;
                var dllUri = assemblyName + ".reference." + dllName + ".dll";
                //                var dllUri = assemblyName + "." + dllName + ".dll";
                using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
                {
                    var assemblyData = new Byte[resourceStream.Length];
                    resourceStream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData); //加载dll
                }
            };
            return true;
            }
            catch (System.Exception e)
            {
                return false;
            }
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值