• C#自动实现Dll(OCX)控件注册的两种方法尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写。 当需要用到Dll引用的...
    C#自动实现Dll(OCX)控件注册的两种方法尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写。
    当需要用到Dll引用的时候,我们通常会通过“添加引用”的方式将它们纳入到项目中,然后就可以像使用自己的类一样方便的使用它们了。
    但是,有些Dll库(OCX)文件是需要注册到Windows注册表后才能正常添加和使用的。
    本文介绍两种为Dll库(OCX)自动注册的方法,为大家提供参考。
    首先,大家都知道在Windows的“运行”中,输入“Regsvr32.exe 路径”这样的方法来手动注册Dll控件(OCX),显示这种方法对于程序的自动化部署等带来极大的不便,
    因此,今天我们着重介绍如何用C#实现自动注册。
    方法一:调用Regsvr32法
    既然可以在运行栏中输入“Regsvr32.exe 路径”的方法来注册,那么,一定可以在C#程序中采用同样的方法来调用Regsvr32,以实现注册:
    Process p = new Process();
    p.StartInfo.FileName = "Regsvr32.exe";
    p.StartInfo.Arguments = "/s C:\\DllTest.dll";//路径中不能有空格
    p.Start();
    采用这种方法,注意要添加对命名空间System.Diagnostics的引用:using System.Diagnostics;
    另外,这种方法有一个不足之处,那就是注册工作是在本程序之外由Regsvr32.exe程序来完成的,系统内不方便知道注册的结果,也不方便对注册过程弹出的对话框进行自定义和控制。
    这里附Regsvr32的参数说明:(感谢网友伍华聪的提醒)
    regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:
      regsvr32    [/i[:cmdline]] DLL文件名
      命令可以在“开始→运行”的文本框中,也可以事先在bat批处理文档中编写好命令。未带任何参数是注册DLL文件功能,其它参数对应功能如下:
      /u:反注册DLL文件;
      /s:安静模式(Silent)执行命令,即在成功注册/反注册DLL文件前提下不显示结果提示框。
      /c:控制端口;
      /i:在使用/u反注册时调用DllInstall;
      /n:不调用DllRegisterServer,必须与/i连用。
     
    方法二:调用DllRegisterServer函数法
     研究Regsvr32.exe和Dll文件,我们会发现,其实每个需要注册的文件都包括一个DllRegisterServer()方法,Regsvr32.exe就是通过调用该方法来完成Dll的注册的。
    知道了这个,我们就可以自己调用DllRegisterServer()来完成注册过程啦。
    首先,还得引入外部方法:
    [DllImport("DllTest.dll")]
    public static extern int DllRegisterServer();//注册时用
    [DllImport("DllTest.dll")]
    public static extern int DllUnregisterServer();//取消注册时用
    接下来就不难啦:int i = DllRegisterServer();
    if (i >= 0)
    {
        //注册成功!
    }
    else
    {
        //注册失败
    }
    取消注册的过程就不应再贴代码啦。
     
    如何对Dll是否已经注册过了做出判断?
    一般情况下,我们可以将对Dll控件的注册过程放在系统启动的过程中来完成,但是,总不能每次启动都注册一次吧?这样做显然不合理。
    那么,我们就来判断一下,当前Dll是否已经注册过,如果已注册过,就跳过注册过程。
    每一个Dll的注册都会在注册表里记录下有关它本身的资料,如注册路径,唯一ID等。我们这里就是利用它留下的唯一ID号来判断:
    RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey("CLSID\\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\\");
    if (rkTest == null)
    {  
     //Dll没有注册,在这里调用DllRegisterServer()吧

    注意要添加对命名空间Microsoft.Win32的引用:using Microsoft.Win32;
    其中的“{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”就是该Dll的唯一ID啦,每一个Dll文件都会不一样的。
    但是,问题又来了,怎么样知道它的唯一ID呢?其实很简单,那就是“逆向思维”。
    我们可先注册这个Dll文件,然后到注册表的“HKEY_CLASSES_ROOT\CLSID”分支下“查找”Dll的名称或路径,就可以看到这个ID啦。  
    展开全文
  • 创建C#或VB.Net DLL后,您需要在目标计算机上注册。 您可以使用Microsoft的RegAsm.exe实用程序。 Regasm.exe是一个程序集注册工具,用于读取程序集中的元数据。并将所需的项添加到注册表中。注册表允许允许COM...

    原文地址:http://www.geeksengine.com/article/register-dll.html 感谢原作者

    创建C#或VB.Net DLL后,您需要在目标计算机上注册。 您可以使用Microsoft的RegAsm.exe实用程序。

    Regasm.exe是一个程序集注册工具,用于读取程序集中的元数据。并将所需的项添加到注册表中。注册表允许允许COM客户端(VB6应用程序或Microsoft VBA,例如Access,Excel等)创建.NET Framework类。类一经注册,则在任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建。

    说明:

    Regasm.exe所在路径没有被系统添加PATH环境变量中,因此,REGASM命令无法识别。使用时,需要DOS窗口切换到其存储路径后才能运行运行。其一般存储的路径为:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ 系统的版本不同,运路径中的数字可能会有一些差异,如下面说明:

    1. 2.0,3.0和3.5等.Net Framework使用相同的RegAsm.exe,它位于.Net FrameworkV2.0文件夹里面如下路径。分X86/64位Framework

      C:\Windows\Microsoft.NET\Framework(32位Framework框架)\ V2.0.50727 \ RegAsm.exe

      或者

       C:\Windows\Microsoft.NET \Framework64(64位Framework框架)\ V2.0.50727 \ RegAsm.exe

    2. 4.0以上版本的.Net Framework使用一个新的RegAsm.exe,它位于.Net FrameworkV4.0文件夹中。

      C:\Windows\Microsoft.NET\Framework(32位Framework框架\v4.0.30319 \ RegAsm.exe

      或者

      C:\Windows\Microsoft.NET\Framework64(64位Framework框架)\v4.0.30319 \ RegAsm.exe

    1:RegAsm.exe和DLL映射

    如果您收到此错误“RegAsm:错误RA0000:无法加载”c:\ Windows\ system32 \ SimpleCalc.dll因为它不是一个有效的.NET程序集“,您可能在使用.Net4版本以下的 RegAsm.exe进行 注册.Net4以上版本创建的DLL。

    .Net框架 RegAsm.exe默认安装路径 你的DLL创建的Framework版本
    .Net框架2.0 / 3.0 / 3.5 C:\ Windows\ Microsoft.NET \(32/64位Framework框架\ V2.0.50727 \ RegAsm.exe .Net框架2.0 / 3.0 / 3.5
    .Net框架4.0、4.5、4.6 C:\ Windows\ Microsoft.NET \(32/64位Framework框架框架\ v4.0.30319 \ RegAsm.exe .Net框架4.0、4.5、4.6

    所以当注册由.Net Framework4 以上版本创建的DLL程序集时,我们不能使用.Net Framework 2.0 / 3.0 / 3.5文件夹中的RegAsm.exe进行注册。


    2:如何运行RegAsm.exe

    要执行RegAsm.exe,请用管理员权限打开一个命令提示符窗口,并进行切换到到RegAsm.exe所在的文件夹并运行它(否则将获得“RegAsm不被识别为内部或外部命令,可操作的程序或批处理文件”错误消息)。

    切换到RegAsm.exe所在的文件夹并运行它


    假设我已经将我的DLL添加到文件夹C:\ Windows\ system32,那么我可以运行以下命令:

    C:\ Windows\ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe SimpleCalc.dll / codebase

    请注意,您不需要在命令中指定C:\ Windows\ system32,因为它是系统文件夹。 RegAsm.exe将自动查找C:\ Windows\ system32目录中的SimpleCalc.dll。

    / codebase参数是一个可选参数,它将关于DLL的信息添加到Windows注册表中,该注册表指定了磁盘上程序集的路径。



    3:Regasm也可用于注销DLL

    如果您获得的DLL没有与其关联的类型库文件,则可以使用Regasm实用程序和/ tlb选项生成。

    C:\ Windows\ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe SimpleCalc.dll /tlb:SimpleCalc.tlb


    请注意,要从DLL导出类型库,您需要在计算机上具有管理员权限,否则将收到此类错误“RegAsm:error RA0000:保存导出的类型库时出错:访问被拒绝... “因为您运行regasm.exe的帐户无权写入该文件夹。

    请注意,您可以为.Net Framework  下的egAsm.exe创建环境变量,以简化DLL注册。

    4:Regasm也可使用批处理命令来注册程序

    如果需要在多台电脑上进行注册,或者要注册的DLL组件比较多的情况下,可以使用如下的批处理命令进行注册。

    @echo off

    set path = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\;%path%

    RegAsm  /codebase C:\Windows\System32\SimpleCalc.dll

    pause

    ::C:\Windows\System32\SimpleCalc.DELL为组件和存放全路径

    ::C:\Windows\Microsoft.NET\Framework64\v4.0.30319\;为REGASM.EXE所在文件夹路径。

    说明:将上面批处理命令存为  CMD.bat 后,双击即可完成注册。当注册不成功时,在CMD.BAT文件上单击右键,选择以管理员身份运行即可完成注册。

    祝您编码快乐!

    其他参考资料:

    https://msdn.microsoft.com/zh-cn/library/tzat5yw6(VS.80).aspx

    http://jingyan.baidu.com/article/09ea3ede65a7c8c0aede39c1.html


    其他文章系列:

    (1)如何正确地创建Access或Excel中的DLL(或在任何Microsoft Office应用程序或VB6中使用)http://blog.csdn.net/kongwei521/article/details/77921436

    (2)如何正确地将C#或VB.Net的DLL在开发机器或者生成环境机器中注册 http://blog.csdn.net/kongwei521/article/details/77929273

    (3)如何正确地在Access VBA或Excel VBA内引用访问C#或VB.Net写的DLL http://blog.csdn.net/kongwei521/article/details/77929277


    展开全文
  • 手动注册C#写的dll和通过InstallShield2015LimitedEdition 打包exe 1/首先,通过C#是不能直接通过regsvr32 XXX.dll注册的,按照网上的解释,是因为C#写的dll是伪dll,所以不能通过这种方式来注册。会提示:这里,...

    手动注册C#写的dll和通过InstallShield2015LimitedEdition 打包exe

    1/首先,通过C#是不能直接通过regsvr32 XXX.dll来注册的,按照网上的解释,是因为C#写的dll是伪dll,所以不能通过这种方式来注册。会提示:这里,就可以通过另外一种注册方式regasm 来注册。

    2/regasm注册方式:1.到本机目录:C:\Windows\Microsoft.NET\Framework下,找到自己的版本,例: C:\Windows\Microsoft.NET\Framework\v4.0(查找一下自己的regasm在那个位置下,我的是在C:\Windows\Microsoft.NET\Framework\v4.0目录),然后执行regasm /codebase 自己需要注册的dll,例:regasm /codebase C:\Users\lming\Desktop\12121212\ ActiveX.dll 以上就完成了注册。通过这种方式,同样可以注册未勾选com互注册编译后的dll

    3/通过InstallShield2015LimitedEdition来打包注册,这个就是打包成一个exe或者msi的文件,来进行注册。打包exe呢,网上教程一大片,自己找吧。最后有一个比较注意的地方。就是激活后的和未激活的InstallShield2015LimitedEdition 默认打包有些不一样的地方。未激活的是默然打包成一个exe文件,激活后的,是分开的,这个是为了给激活账户一个自定义注册操作的权限,具体哪些,后文介绍,暂时未仔细研究。这里,就需要修改属性,来将我们需要打包的,打包成exe了。操作如下:1.解决方案,右键属性,选择配置,将配置改成单一镜像然后你要生成的exe就在SingleImage这个目录下,不会在以前的那个目录下。。。

     

    展开全文
  • c# 注册模块Dll 直接引用 调用即可,注册机可以找我要QQ:jasonto@qq.com 使用方法: private void Form1_Load(object sender, EventArgs e) { try { Reg abc = new Reg("test.exe");//test.exe为应用程序名称; ...
  • C#自动注册dll方法

    2015-01-20 17:03:37
    C#编译的Dll动态链接库自动注册方法

          详解一种C#自动注册dll的方法~

        需要在Delphi主程序下调用一个自己写的C#链接库,乐滋滋的写好功能后顺利编译成dll。没想到调用时就出现问题了,几经折腾发现是C#编译的dll木有注册。好了,找了好多个dll注册方法,在自己电脑上搞定了。但是怎么在别人的机子进行自动注册呢,不可能我把程序搞到别人机子上要给他们一个个注册我的链接库吧?这是个大问题啊,网上搜搜无果,时间紧迫,本姑娘脑洞大开,想了个法子。在我的delphi主程序下敲了段代码解决了这个燃眉之急。不知道这个法子是不是正解,但是至少功能是实现了,写出来让大家拍拍砖吧~

        直接上代码 

    function autoRegisterDll():Boolean ;
    var
      str1:string;
      str2:string;
      TStr,tempStr:string;
      f:TextFile;
      FileName:string;
       s: PChar;begin

    begin
        GetMem(s,255);
        GetSystemDirectory(s,255);    //路径获取
        Tstr:=Copy(s,1,1);
        FreeMem(s);

     //直接创建了个一个temp.cmd文档,写进cmd命令。
        str1:='cd '+TStr+':\Windows\Microsoft.NET\Framework\v2.0.50727';
        tempStr := IncludeTrailingBackslash(ExtractFileDir(Application.ExeName));
        FileName:=TempStr+'temp.cmd';
        str2:= 'RegAsm '+'"'+tempStr+'SectionClipApp.dll"';

        AssignFile(f,FileName);
        rewrite(f);
        Writeln(f,TStr+':');
        Writeln(f,str1);
        Writeln(f,str2);
        CloseFile(f);

    //打开temp.cmd文件,执行,注册成功~
       ShellExecute(0,'Open',PChar(FileName),nil,nil,SW_HIDE);
    end;

    /*生成的cmd文本内容如下

    C:
    cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
    RegAsm "E:\开发程序\3DM CAD(6028)\SectionClipApp.dll"

    */

    是不是觉得这个方法很贱呢偷笑

     

     

     

    展开全文
  • C# 编写DLL 让VB调用

    2020-05-22 23:30:37
    VB调用C#编写的DLL 使用VS C#编写DLL函数。封装好,实现DLL注册功能。达到VB调用。
  • C#程序注册dll文件

    2019-06-12 21:21:17
    为什么80%的码农都做不了架构师?>>> ...
    • 不需要管理员权限和RegAsm.exe文件
    public static bool RegCom(string path){
    	Assembly assembly = Assembly.LoadFile(path);
    	Type[] Types = assembly.GetExportedTypes();
    
    	foreach (Type type in Types){
    	ComVisibleAttribute[] attributes = (ComVisibleAttribute[])type.GetCustomAttributes(typeof(ComVisibleAttribute), false);
    	if (attributes.Length > 0 && attributes[0].Value) {
            Register(type);
    	}
    	}
    }
    
    static void Register(Type type)
    {
        string ProgID = type.FullName;
        string Version = type.Assembly.GetName().Version.ToString();
        string GUIDstr = "{" + type.GUID.ToString() + "}";
        string keyPath = @"Software\Classes\";
    
    
        RegistryKey regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
    
        RegistryKey regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
     
        RegistryKey[] keys = {regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl),
                        regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl)};
    
                
        ProgIdAttribute[] attributes = (ProgIdAttribute[])type.GetCustomAttributes(typeof(ProgIdAttribute), false);
    
        if (attributes.Length > 0)
            ProgID = attributes[0].Value;
    
        foreach(RegistryKey RootKey in keys)
        {
            //[HKEY_CURRENT_USER\Software\Classes\Prog.ID]
            //@="Namespace.Class"
                    
            RegistryKey keyProgID = RootKey.CreateSubKey(ProgID);
            keyProgID.SetValue(null, type.FullName);
    
            //[HKEY_CURRENT_USER\Software\Classes\Prog.ID\CLSID]
            //@="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
            keyProgID.CreateSubKey(@"CLSID").SetValue(null, GUIDstr);
    
    
            //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}]
            //@="Namespace.Class
            //
            RegistryKey keyCLSID = RootKey.OpenSubKey(@"CLSID", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(GUIDstr);
            keyCLSID.SetValue(null, type.FullName);
    
    
            //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\ProgId]
            //@="Prog.ID"
            keyCLSID.CreateSubKey("ProgId").SetValue(null, ProgID);
    
    
            //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32]
            //@="mscoree.dll"
            //"ThreadingModel"="Both"
            //"Class"="Namespace.Class"
            //"Assembly"="AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=71c72075855a359a"
            //"RuntimeVersion"="v4.0.30319"
            //"CodeBase"="file:///Drive:/Full/Image/Path/file.dll"
            RegistryKey InprocServer32 = keyCLSID.CreateSubKey("InprocServer32");
            SetInprocServer(InprocServer32, type, false);
    
            //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32\1.0.0.0]
            //"Class"="Namespace.Class"
            //"Assembly"="AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=71c72075855a359a"
            //"RuntimeVersion"="v4.0.30319"
            //"CodeBase"="file:///Drive:/Full/Image/Path/file.dll"
            SetInprocServer(InprocServer32.CreateSubKey("Version"), type, true);
    
            //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]
            keyCLSID.CreateSubKey(@"Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}");
    
            keyCLSID.Close();
        }
    
    }
    
    static void SetInprocServer(RegistryKey key, Type type, bool versionNode)
    {
    
        if (!versionNode)
        {
            key.SetValue(null, "mscoree.dll");
            key.SetValue("ThreadingModel", "Both");
        }
    
        key.SetValue("Class", type.FullName);
        key.SetValue("Assembly", type.Assembly.FullName);
        key.SetValue("RuntimeVersion", type.Assembly.ImageRuntimeVersion);
        key.SetValue("CodeBase", type.Assembly.CodeBase);
    }
    
    • 需要管理员权限
     public static bool RegCom(string path){
                Assembly asm = Assembly.LoadFile(path);
                RegistrationServices regAsm = new RegistrationServices();
    bool  bResult=regAsm.RegisterAssembly(asm,AssemblyRegistrationFlags.SetCodeBase);
                return bResult;
            }
    

    转载于:https://my.oschina.net/xfan/blog/2965716

    展开全文
  • C#有关技术资料,这里可以在C#中,实现帮助你注册DLL文件,而不用在注册表里面进行注册
  • 用C#生成.dll 供VB6的开发人员调用 C#生成基于COM的DLL供VB调用 用C#生成.dll 供VB6的开发人员调用 里面有两个方法  Encrypt(string pToEncrypt,string sKey) //加密  Decrypt(string pToDecrypt,string ...
  • System.Diagnostics.Process.Start("regsvr32", @"C://WINDOWS//system32//cell32.ocx /s");
  • PB调用C#编写的DLL

    2018-06-27 14:08:19
    PB调用C#编写的DLLC#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它进一步的...
  • Delphi调用C# 编写dll动态库
  • Java利用JNA调用C#dll

    2019-02-12 10:07:24
    本文参考以上链接,结合自己实际遇到的问题,做... 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑java来调用现成的c#dll实...
  • 最近做一个项目,需要在WEB端上传文件并打zip包,供...而c#的FileInfo类获取到的文件修改时间是精确到微秒,而且这两个时间在微秒的取舍上并没有四舍五入、逢余进一等规律,所以自己用C#编写了一个dll库,提供C#的文件
  • C#引用C++开发DLL

    2019-03-25 17:11:13
    在.Net 开发中如果使用外部DLL,一般引用进来就可以了,最多引用前将DLL注册一下。最近做的项目中需要使用硬件厂家C++开发的DLL,我还照原来的方式引用却报错,一步步下来却发现原来还有这么多技巧需注意。下面...
  •  最近一段时间单位在做一个Web项目,工程师用JAVA语言,需要公用人员信息,统一用户名和密码,原有的平台中是用C#语言开发的,在网上查找解决方法,通过JAVA调用C#的DLL文件实现。网上资料很多,自己整合总结了一下...
  • 开发ie插件的时候也就是c#+bho,生成dll,然后通过命令(regasm /codebase "D:\Works\visual studio\Projects\ie-bho-extension\bin\Debug\ IEExtension.dll" )注册到注册表,但是在IE的配置里显示不能使用,代码都...
  • 由于之前过在java中调用C语言的dll,所以开始是考虑把C#dll用C封装成新的dll,然后使用JNA在java中调用,但是实际操作的时候,由于C调用C#需要使用托管语言,由于本人对于C及C#都不了解,在C封装C#导出成dll的...
  • 目前遇到c++调用C#写的DLL 问题,把C#DLL注册为COM组件,在本机测试完成了,但在客户的机器上无法通过,注册的方式是通过Regasm 去注册dll 和tlb文件 ,但是排查注册表的时候发现未完全注册进去,在其它机器上是否...
1 2 3 4 5 ... 20
收藏数 12,128
精华内容 4,851