C# 只想要一个exe文件,试试这个方式

a3871555a176c75dc58658a837ecbfe9.png

前言

940a7d1662d6c29ac189e6380c80e26a.png

30fed6e238c13531ce3337e5647c9381.png

    诚然,在之前的文章中也有写过将所有文件合入到一个exe文件中的方式,一种是通过打包,一种是通过资源文件【文末附带链接】,但是两个方法到最后运行的时候都是需要释放出来,所以相对来说还是不够友好;

现在,我们可以通过这篇文章用另一种方式来实现。

57b5c016d19a1c52dd4f3a90ee411577.png

0b3ada35ca533c2acf05af5753557411.gif

d01d896d64fe9961f150add34e532e08.jpeg

开发环境:.NET Framework版本:4.8

开发工具:Visual Studio 2022

e81f78b73fe76ef35690d08f2d2f172b.png

实现步骤

e7f956f5cdaa4429781b825243cc3400.png

  1. 以下测试我们要实现的是集成两个DLL,一个是自己的项目类库ClassLibrary1,另一个是使用第三方的Newtonsoft.Json.dll

  2. 在主程序中新建一个Lib文件夹,将Newtonsoft.Json.dll放入进去并引用。

  3. 在项目中新建一个类库ClassLibrary,并在其中随便实现一段代码方便调用

namespace ClassLibrary1
{
    public class Common
    {
        public int Add(int a,int b)
        {
            return a+b;
        }
    }
}
  1. 将以上类库生成后,同时引入到主程序中,并将生成的ClassLibrary1.dll放入到Lib文件夹中,最后项目框架如下

8eb123dd7eb8cfaf0b93cb075f5b6f23.png

  1. 在引用下的两个dll右键->属性->复制本地改为False,这样就在生成的时候不会出现在debug目录下了

  2. 在Lib目录下的两个dll右键->属性->生成操作选择为嵌入的资源

  3. Program文件中注册AssemblyResolve事件,事件内的代码如下

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string assemblyName = Assembly.GetExecutingAssembly().GetName().Name + ".Lib." + new AssemblyName(args.Name).Name + ".dll";
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assemblyName))
            {
                byte[] buffer = new byte[stream.Length];
                stream.Read(buffer, 0, buffer.Length);
                return Assembly.Load(buffer);
            }
        }
  1. 以上,其实就完成了整个操作,但是由于ClassLibrary1项目是我们自己写的,随时会涉及到改动,每次都复制会比较麻烦,而且还有忘记的风险,所以,之前文章中写的生成事件就有用武之地了,我们在ClassLibrary1的生成后事件中添加以下命令,这样每次生成后就会自动复制到Lib目录了

copy "$(TargetPath)" "$(SolutionDir)\$(SolutionName)\Lib"
  1. 最后在窗体中分别实现调用

private void button1_Click(object sender, EventArgs e)
        {
           MessageBox.Show(""+new Common().Add(3, 4));
        }


        private void button2_Click(object sender, EventArgs e)
        {
            Dictionary<string,object> dic=new Dictionary<string, object>();
            dic.Add("name", "张三");
            dic.Add("age", 20);
            string json = JsonConvert.SerializeObject(dic);
            MessageBox.Show(json);
        }

cf9f3bac92df8e4bb963511772e906c3.png

实现效果

c0e61e5452fee6a197cd0a3b77378f1c.png

41ed1784b694614c536e3c8070b1c322.gif

☛☛☛点击此处下载源码☚☚☚

c790bcb2ba1e67dc9b03d7faf4a0d3ed.png

可参考文章

b85a47d266581048837137baa3581996.png

C#资源文件的使用


如何将程序打包成exe


C# 反射之动态生成dll/exe


Visual Studio 预先/后期 生成事件

78f9d3bc2fba1ba88307b4636114f7e7.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值