• powershell初探(九)


      最近公司需要用到com,其中涉及到很多的注册问题,记录在这里,希望在帮到别人的同时,也能解决自己的问题。

      0:写在前面,本人菜鸟一枚。本章的总结都来自于网络,如果有错漏之处,还望牛人指正~

      1:COM是做什么用的?

      com是包含了实现一个或多个接口的类的一个实例的二进制文件(dll或exe)。好吧,我也晕了~首先,com是一个类的实例的二进制文件,这个类必须实现一个或多个接口。它的存在是为了代码的重用,让你可以像组装汽车一样组装你的程序。他需要注册到注册表中,并需要一个唯一的标示,以便在之后创建时通过这个唯一的标示来找到对应的com并且创建它。

      2:regsvr32和regasm有什么不同?

      regsvr32是注册传统的COM组件的方法,regasm是将用.NET编写的dll注册为COM组件的方法。具体区别会在后面说明。

      3:一个32位的传统COM如何在64位的机器上注册或者使用?

      首先,传统的32位机器注册传统的COM组件应该是在\WINDOWS\System32 下,进入这个目录运行regsvr32 xxx.dll。但是当你在64位机器上运行时会得到这个错误

      

      此时你需要将这个dll放在/WINDOWS/SysWOW64下进入这个目录运行一次regsvr32 xxx.dll在你的dll没问题的情况下会提示你注册成功

      

      看到这个之后,别高兴太早,当你真正的去ASP页面中创建这个对象并且访问这个ASP页面,你会得到如下错误

      

      这是因为你的IIS不是在兼容32位应用的模式下运行的,打开CMD输入

      

    cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs set W3SVC/AppPools/Enable32bitAppOnWin64 1

      此时你的IIS将兼容32位的com组件。你可以成功的使用COM了

      PS:要是在sys64WOW下也提示你找不到模块,那你该去查查你的系统了,推荐一个depends的工具,可以查看你的dll缺失的模块

      4:如何将C#代码编写的dll注册并作为COM使用?

        a:在VS中创建一个C#库类项目,输入以下代码(只是一个事例,可根据具体情况调整)

        

    using System;
    using System.Runtime.InteropServices;//必须引用该程序集,这样才能在方法,类名前加上Guid特性
    using System.Text;
    namespace MyCom
    {
        [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]//guid,唯一标示接口
        public interface MyCom_Interface
        {
            [DispId(1)]//接口方法的ID
            int Add(int a, int b);
        }
    
        [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]//在Com中调用事件必须以接口的方式
        public interface MyCom_Events
        {
        }
        [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(MyCom_Events))]//标示唯一类名
        public class Class1 : MyCom_Interface
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
        }
    }

        b:配置VS

          (0):右键项目名,打开属性窗口

          (1):在应用程序下单击程序集信息,勾选使程序集COM可见

          

          (2):在生成下勾选为COM互操作注册

      

          (3):在签名下新建一个签名,以便生成一个强命名的程序集

     

          (4):生成该解决方案

        c:打开VS的命令行工具,将目录切换到刚刚生成的程序集的目录下

        

        d:输入以下命令,注册程序集

    regasm /codebase /tlb xxx.dll

         成功信息

        

        将程序集添加到全局缓存域

    gacutil /i xxx.dll

      在注册表下我们可以看到这个COM对象了

      

      这里显示的是progID,也就是将要在powershell中使用的com的名字

      PS:原教程请看这个链接http://blog.sina.com.cn/s/blog_538342930100nlmk.html

        GUID可以使用VS自带的工具生成

      5:现在,这个COM就可以在powershell中使用了(当然也可以在ASP页面中使用)

        

      最后,新的一年,祝大家愉快~  

  • 相关阅读:
    Javascript 与 c# 数据加密互通 DEC
    Auto.js 隐藏日志信息、定时器
    Auto.js 检测开启无障碍
    Auto.js 初学碰到的坑
    SmartAssembly 汉化说明
    espcms 表结构说明
    处理器调度
    进程死锁与避免
    并发程序设计
    Mysql性能调优
  • 原文地址:https://www.cnblogs.com/iiaijimaai/p/2841645.html
Copyright © 2020-2023  润新知