现在介绍一种使用资源文件,将dll、ocx打包进exe,点击直接注册的例子:

很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个exe,点击直接运行呢?就像很多安全控件,如支付宝的aliedit.exe那样。

      现在介绍一种使用资源文件,将dll、ocx打包进exe,点击直接注册的例子:

      首先,新建一个工程RegisterFile。  新建文件夹Resource,里面添加需要注册的ocx或dll。这里我添加的是dsoframer.ocx,并将其文件“属性”中“生成操作”项的值改为“嵌入的资源”。

     

      接下来,创建类Register.cs   里面只有一个函数RegisterDll()。 这里为省事,我把它放到了Program.cs里,同一命名空间下,效果是一样的。    

      view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Windows.Forms;  
 
using System.Diagnostics;  
 
namespace RegisterFile  
{  
    static class Program  
    {  
        /// <summary>  
        /// 应用程序的主入口点。  
        /// </summary>  
        [STAThread]  
        static void Main()  
        {  
            Application.EnableVisualStyles();  
            Application.SetCompatibleTextRenderingDefault(false);  
            Application.Run(new frmMain());  
        }  
    }  
 
 
 
    class Register  
    {  
        public void RegisterDll(string strDll)  
        {  
            Process p = new Process();  
            p.StartInfo.FileName = "Regsvr32.exe";  
 
            p.StartInfo.Arguments = " " + strDll;  
            p.Start();  
 
            p.Close();  
        }  
    }  

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

using System.Diagnostics;

namespace RegisterFile
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }

    class Register
    {
        public void RegisterDll(string strDll)
        {
            Process p = new Process();
            p.StartInfo.FileName = "Regsvr32.exe";

            p.StartInfo.Arguments = " " + strDll;
            p.Start();

            p.Close();
        }
    }
}

     

      最后,在Form1_Load()中添加代码:  

      view plaincopy to clipboardprint?
//需要添加引用  
//using System.IO;  
//using System.Reflection;  
//using System.Resources;          
 
 
        private void Form1_Load(object sender, EventArgs e)  
        {  
            this.Visible = false;  
 
            string strPath = string.Empty;  
            strPath = System.Environment.CurrentDirectory;  
 
 
            Assembly asm = Assembly.GetEntryAssembly();  
            using (Stream stream = asm.GetManifestResourceStream("RegisterFile.Resource.dsoframer.ocx"))  
            {  
                int len = (int)stream.Length;  
                byte[] byts = new byte[len];  
 
                stream.Read(byts, 0, len);  
                stream.Close();  
 
                using (FileStream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\richgrid.ocx", FileMode.Create))  
                {  
                    fs.Write(byts, 0, len);  
                }  
            }  
 
              
 
            Register r = new Register();  
            r.RegisterDll("dsoframer.ocx");  
 
            this.Close();  
        } 
//需要添加引用
//using System.IO;
//using System.Reflection;
//using System.Resources;       


        private void Form1_Load(object sender, EventArgs e)
        {
            this.Visible = false;

            string strPath = string.Empty;
            strPath = System.Environment.CurrentDirectory;


            Assembly asm = Assembly.GetEntryAssembly();
            using (Stream stream = asm.GetManifestResourceStream("RegisterFile.Resource.dsoframer.ocx"))
            {
                int len = (int)stream.Length;
                byte[] byts = new byte[len];

                stream.Read(byts, 0, len);
                stream.Close();

                using (FileStream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\richgrid.ocx", FileMode.Create))
                {
                    fs.Write(byts, 0, len);
                }
            }

           

            Register r = new Register();
            r.RegisterDll("richgrid.ocx");

            this.Close();
        }

     注意:Stream stream = asm.GetManifestResourceStream("RegisterFile.Resource.richgrid.ocx")中"RegisterFile.Resource.richgrid.ocx"的取值为“命名空间”+ “文件夹” + “文件名称”。

还有注册控件VB版。其实VB版才是先写的,后来才做的C#版。

编译时候错误提示:“ null值”对于“stream”无效。 低级的错误让我郁闷了一天,最终解决办法如下:

1,把文件richgrid.ocx添加到项目中(在项目上右键—〉添加—〉添加现有项—〉找到并选择richgrid.ocx)

2,在已经添加到项目中的richgrid.ocx上右键—〉属性—〉生成的操作—〉选择“嵌入的资源”

3,正常运行

posted @ 2011-04-02 12:34  许明吉博客  阅读(3083)  评论(0编辑  收藏  举报