将DLL文件直接封装进exe执行文件中(C#)

前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发。但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确,所以这里采用C#调用C++封装的DLL文件,但是由于工具本身就小,就想将DLL文件直接封装进EXE执行文件中,于是有了下面的解决方法,该方法笔者已经实现,并投入了使用中。


具体解决方法如下:

1.首先在项目工程中加入一个文件夹,将所需DLL文件加载进来,笔者的项目目录如下图。

2.双击Properties文件夹下的Resource.resx文件,选择“添加资源”->“添加现有文件”将FindDisk.dll文件加入项目中,并保存。

3.在程序启动时候,对system32文件夹下进行判断,判断是否存在我们所需的FindDisk.dll文件,如没有,就从资源文件中读取出来,并拷贝到system32目录下(64位操作系统会自动拷贝到C:\Windows\SysWOW64目录下)。代码如下:

        /// <summary>
        /// 将dll文件拷贝到系统目录
        /// </summary>
        private void copyDLL()
        {
           
            string finddiskPath = @"C:\Windows\System32\FindDisk.dll";//设置释放路径  

            string msvcrdllPath = @"C:\Windows\System32\msvcr100d.dll";//设置释放路径  

            //创建dll文件
            if (!File.Exists(finddiskPath))
            {
                byte[] finddiskDll = Resources.FindDisk;//获取嵌入dll文件的字节数组  

                using (FileStream fs = new FileStream(finddiskPath, FileMode.Create))
                {
                    fs.Write(finddiskDll, 0, finddiskDll.Length);
                }
            }

            //创建dll文件
            if (!File.Exists(msvcrdllPath))
            {
                byte[] msvcrDll = Resources.msvcr100d;

                using (FileStream fs = new FileStream(msvcrdllPath, FileMode.Create))
                {
                    fs.Write(msvcrDll, 0, msvcrDll.Length);
                }
            }
        }        

至此,将DLL文件封装进exe执行程序中的主要操作完成,具体如何调用,可参看:Java(使用JNA)调用DLL库与C#调用DLL库的对比


by Shawn Chen,2017.7.4日,晚。

posted @ 2017-07-04 21:18  developer_chan  阅读(4870)  评论(2编辑  收藏  举报