最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中如何把dll打包到exe

 更新時(shí)間:2023年06月16日 14:54:47   作者:故里2130  
這篇文章主要介紹了C#中如何把dll打包到exe問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

把其他類(lèi)庫(kù)生成的dll,和現(xiàn)在的exe打包在一起,發(fā)給別人的時(shí)候,就發(fā)一個(gè)exe即可。

一共二種方法

第一種

1.建立一個(gè)類(lèi)庫(kù)項(xiàng)目

代碼

生成dll

2.建立一個(gè)winform項(xiàng)目

3.在項(xiàng)目中把dll引用里面去

4.把dll直接復(fù)制到項(xiàng)目的根目錄中

并且修改下面2項(xiàng) 

5.回到項(xiàng)目的界面上

在按鈕中增加ClassLibrary1.dll的方法

6.在啟動(dòng)的地方加上代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
    static class Program
    {
        /// <summary>
        /// 應(yīng)用程序的主入口點(diǎn)。
        /// </summary>
        [STAThread]
        static void Main()
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {
                //WindowsFormsApp2 這個(gè)是主程序的命名空間
                string resourceName = "WindowsFormsApp2." + new AssemblyName(args.Name).Name + ".dll";
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {
                    Byte[] assemblyData = new Byte[stream.Length];
                    stream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData);
                }
            };
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

7.點(diǎn)擊生成,此時(shí)把exe發(fā)到任何電腦都是可以的。

效果如下。

拓展1

WPF需要這樣

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp1
{
    /// <summary>
    /// App.xaml 的交互邏輯
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {
                //WpfApp1 這個(gè)是主程序的命名空間
                string resourceName = "WpfApp1." + new AssemblyName(args.Name).Name + ".dll";
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {
                    Byte[] assemblyData = new Byte[stream.Length];
                    stream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData);
                }
            };
        }
    }
}

拓展2

如果大量的dll,需要建立一個(gè)文件夾,把dll都放進(jìn)去 ,把dll全選設(shè)置成資源

在路徑中一定要加上文件夾的名字

第二種

1.建立一個(gè)項(xiàng)目

再建立一個(gè)文件夾,把dll放進(jìn)去

2.對(duì)文件夾下面的dll進(jìn)行設(shè)置

3.對(duì)引用下面的dll

復(fù)制本地改成FALSE

4.創(chuàng)建一個(gè)類(lèi)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp5
{
    public static class LoadResoureDll
    {
        /// <summary> 已加載DLL
        /// </summary>
        private static Dictionary<string, Assembly> LoadedDlls = new Dictionary<string, Assembly>();
        /// <summary> 已處理程序集
        /// </summary>
        private static Dictionary<string, object> Assemblies = new Dictionary<string, object>();
        /// <summary> 在對(duì)程序集解釋失敗時(shí)觸發(fā)
        /// </summary>
        /// <param name="sender">AppDomain</param>
        /// <param name="args">事件參數(shù)</param>
        private static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
        {
            try
            {
                //程序集
                Assembly ass;
                //獲取加載失敗的程序集的全名
                var assName = new AssemblyName(args.Name).FullName;
                //判斷Dlls集合中是否有已加載的同名程序集
                if (LoadedDlls.TryGetValue(assName, out ass) && ass != null)
                {
                    LoadedDlls[assName] = null;//如果有則置空并返回
                    return ass;
                }
                else
                {
                    return ass;//dev的dll 這里有問(wèn)題,可以繞過(guò)
                    throw new DllNotFoundException(assName);//否則拋出加載失敗的異常
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("error1:\n位置:AssemblyResolve()!\n描述:" + ex.Message);
                return null;
            }
        }
        /// <summary> 注冊(cè)資源中的dll
        /// </summary>
        /// <param name="pattern">*表示連續(xù)的未知字符,_表示單個(gè)未知字符,如*.dll</param>
        public static void RegistDLL(string pattern = "*.dll")
        {
            System.IO.Directory.GetFiles("", "");
            //獲取調(diào)用者的程序集
            var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
            //判斷程序集是否已經(jīng)處理
            if (Assemblies.ContainsKey(ass.FullName))
            {
                return;
            }
            //程序集加入已處理集合
            Assemblies.Add(ass.FullName, null);
            //綁定程序集加載失敗事件(這里我測(cè)試了,就算重復(fù)綁也是沒(méi)關(guān)系的)
            AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
            //獲取所有資源文件文件名
            var res = ass.GetManifestResourceNames();
            var regex = new Regex("^" + pattern.Replace(".", "\\.").Replace("*", ".*").Replace("_", ".") + "$", RegexOptions.IgnoreCase);
            foreach (var r in res)
            {
                //如果是dll,則加載
                if (regex.IsMatch(r))
                {
                    try
                    {
                        var s = ass.GetManifestResourceStream(r);
                        var bts = new byte[s.Length];
                        s.Read(bts, 0, (int)s.Length);
                        var da = Assembly.Load(bts);
                        //判斷是否已經(jīng)加載
                        if (LoadedDlls.ContainsKey(da.FullName))
                        {
                            continue;
                        }
                        LoadedDlls[da.FullName] = da;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("error2:加載dll失敗\n位置:RegistDLL()!\n描述:" + ex.Message);
                    }
                }
            }
        }
    }
}

5.在程序的入口處調(diào)用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp5
{
    static class Program
    {
        /// <summary>
        /// 應(yīng)用程序的主入口點(diǎn)。
        /// </summary>
        [STAThread]
        static void Main()
        {
            LoadResoureDll.RegistDLL();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

6.最終會(huì)生成一個(gè)獨(dú)立的exe文件

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#獲取指定年份第一個(gè)星期一具體日期的方法

    C#獲取指定年份第一個(gè)星期一具體日期的方法

    這篇文章主要介紹了C#獲取指定年份第一個(gè)星期一具體日期的方法,涉及C#日期與字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • c#注冊(cè)客戶(hù)端事件示例

    c#注冊(cè)客戶(hù)端事件示例

    這篇文章主要介紹了c#注冊(cè)客戶(hù)端事件使用示例,大家參考使用吧
    2014-01-01
  • 深入理解C#中常見(jiàn)的委托

    深入理解C#中常見(jiàn)的委托

    這篇文章主要介紹了C# 委托(Delegate)的相關(guān)資料,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望能夠幫助到你
    2021-07-07
  • C#使用itextsharp打印pdf的實(shí)現(xiàn)代碼

    C#使用itextsharp打印pdf的實(shí)現(xiàn)代碼

    提到打印,恐怕對(duì)于很多人都不會(huì)陌生,無(wú)論是開(kāi)發(fā)者,還是非計(jì)算機(jī)專(zhuān)業(yè)的人員都會(huì)接觸到打印,?在.NET中實(shí)現(xiàn)PDF打印的組件比較多,例如PDFsharp、Report.NET、sharpPDF、itextSharp等等,今天主要簡(jiǎn)單的介紹itextSharp組件,需要的朋友可以參考下
    2024-04-04
  • 基于C#實(shí)現(xiàn)的HOOK鍵盤(pán)鉤子實(shí)例代碼

    基于C#實(shí)現(xiàn)的HOOK鍵盤(pán)鉤子實(shí)例代碼

    這篇文章主要介紹了基于C#實(shí)現(xiàn)的HOOK鍵盤(pán)鉤子實(shí)例,需要的朋友可以參考下
    2014-07-07
  • C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二 線性結(jié)構(gòu)

    C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二 線性結(jié)構(gòu)

    本文中,我們討論了什么是線性結(jié)構(gòu),線性結(jié)構(gòu)有哪些特點(diǎn),并且詳細(xì)介紹了一個(gè)最簡(jiǎn)單線性結(jié)構(gòu)順序表,并且通過(guò)源代碼對(duì)她進(jìn)行一些列的分析,最后還舉了兩個(gè)例子,讓我們更好的理解順序表
    2012-11-11
  • C#基于JsonConvert解析Json數(shù)據(jù)的方法實(shí)例

    C#基于JsonConvert解析Json數(shù)據(jù)的方法實(shí)例

    最近初接觸C#語(yǔ)言,發(fā)現(xiàn)JSON解析這塊和JAVA差異過(guò)大,下面這篇文章主要給大家介紹了關(guān)于C#基于JsonConvert解析Json數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例

    C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例

    這篇文章主要介紹了C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁(yè)授權(quán)操作的原理、步驟并給出了C#實(shí)現(xiàn)的網(wǎng)頁(yè)授權(quán)操作邏輯封裝類(lèi),需要的朋友可以參考下
    2016-10-10
  • C#字符串與數(shù)值類(lèi)型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    C#字符串與數(shù)值類(lèi)型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    最近由于編程的需要,對(duì)C#的類(lèi)型轉(zhuǎn)換做了一些研究,下面這篇文章主要給大家介紹了關(guān)于C#字符串與數(shù)值類(lèi)型、字節(jié)數(shù)組的互相轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C# OleDbDataReader快速數(shù)據(jù)讀取方式(3種)

    C# OleDbDataReader快速數(shù)據(jù)讀取方式(3種)

    這篇文章主要介紹了C# OleDbDataReader快速數(shù)據(jù)讀取方式(3種),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

蒙自县| 罗定市| 阳信县| SHOW| 广昌县| 淮北市| 伊宁市| 平度市| 沙坪坝区| 五台县| 普陀区| 宝丰县| 尉氏县| 昭通市| 万宁市| 汉寿县| 广水市| 长兴县| 龙泉市| 大名县| 子洲县| 临高县| 依兰县| 大姚县| 广元市| 四平市| 遵义市| 尚义县| 罗甸县| 宜兰市| 宁南县| 临安市| 扎囊县| 喀喇沁旗| 望谟县| 耿马| 阿巴嘎旗| 衡南县| 汽车| 垦利县| 丰县|