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页面中使用)

    

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

原文地址:https://www.cnblogs.com/iiaijimaai/p/2841645.html