zoukankan      html  css  js  c++  java
  • C#与vb6 com组件的互相调用方法[转]

            COM(Component Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。

          COM的优点?1.可代替原来的旧的 2.可重用行 3.简化分布式网络应用程序

           现在讲下用c#开发com,在.net支持的语言里可以直接调用,但在其他语言就不同了(vb6)。主要有2种方法:

          第一种:

          1.首先在vs2005中,新建项目选择c#项目->类库

          编写一下代码

          using System;
          using System.Collections.Generic;
         using System.Text;
        using System.Runtime.InteropServices;

        namespace csLib2
    {
        [ClassInterface(ClassInterfaceType.AutoDispatch)]     //注意这行,这行是关键
        public class Class1
        {
            public int add(int a, int b)
            {
                return (a + b);
            }

            public string mergeString(string a, string b)
            {
                return (a + b);
            }
        }
    }

      2.在文件AssemblyInfo.cs中,设置[assembly: ComVisible(true)],默认是false的,需要设置成true

      3.选择项目属性,在生成标签卡中,勾选为com互操作注册.

      4.生成项目dll文件。

      5。注册:在运行命令窗口中输入cmd,打开命令窗口,然后输入cd  /d+dll文件所在的路径(主要是为了注册省下输入全路径名称),用regasm命令注册

          regasm  csLib2.dll /tlb: csLib2.tlb.这里要注意,需要在环境变量中加入regasm.exe的路径名称,否则会提示regasm无效

      这里说下 AutoDispatch,AutoDual,None三种类型的区别AutoDispatch和None为后期绑定,不会出现版本控制问题,而AutoDual会出现版本问题,极力不推荐。

    用这三种类型生成的dll,然后在vb6引用时区别很明显,在vb6中打开object browser中就可以看到,AutoDual的dll所有方法都可以看到,而AutoDispatch缺只能看到一个空的类.

    6.vb调用。用createobject调用

     dim k as object

     set k = createobject("csLib2.class1")

    debug.print k.add(1,2)

    用AutoDispatch,AutoDual生成的dll,也可以在vb6中先引用然后再调用

    dim k as csLib2.class1

    set k = new csLib2.class1

    debug.print k.add(1,2)

    但是用None生成的则只能用createobject生成

    第二种方法

    1.首先在vs2005中,新建项目选择c#项目->类库

          编写一下代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace ClassLibrary1
    {
        [ComVisible(true)]
        [Guid("D0A1C848-74F3-4234-81B6-B6D739A4C8C7")]
        public interface IMyClass
        {
            string ShowCSharp();
        }

        [ComVisible(true)]
        [Guid("84EE5A00-B434-4B86-959D-3388AB92AD4F")]
        [ProgId("ClassLibrary1.MyClass")]
        public class MyClass
        {
            public string ShowCSharp() 
            {
                return "This is C#";
            }
        }
    }

     2.在文件AssemblyInfo.cs中,设置[assembly: ComVisible(true)],默认是false的,需要设置成true

      3.选择项目属性,在生成标签卡中,勾选为com互操作注册.

      4.生成项目dll文件。

      Guid在工具->创建Guid生成,格式选择第四种,点复制之后需要把两边的{}除掉.

      5.注册.regasm ClassLibrary1.dll /tlb:ClassLibrary1.tlb

     6.在vb6 中引用ClassLibrary1.tlb文件,注意不是ClassLibrary1.dll文件

    引用的话,在vb6编写时可以看到ClassLibrary1的类的方法。

    dim k as Myclass

    set k = new myclass

    debug.print k.ShowCSharp

    用vb6生成dll文件在c#访问方法:方法很简单 看例子

    1.打开vb6工程,选择Activex dll工程,生成了一个空类

    2.编写代码;

    简单起见写一个函数

    Public Function PutStr() As String
        
        PutStr = "this is from vb6"
    End Function

    3.编译生成vbcom.dll文件

    4.打开c#工程,添加vbcom.dll引用

    5.调用

                Project1.Class1 b = new Project1.Class1();
                Console.WriteLine(b.PutStr());

            运行后则会输出this is from vb6

    是不是非常简单?

  • 相关阅读:
    文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: FormMain --- 未能加载基类“WinForm.Win.FormsBase.FormMainBase”。请确保已引用该程序集并已生成所有项目
    Xcopy命令参数使用介绍
    c#生成方案里预生成拷贝文件
    visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出
    开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案
    Java开发知识之XML文档使用,解析
    JAVA开发知识之Java的线程
    git版本控制工具的使用
    Java开发知识之Java的正则表达式
    PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式
  • 原文地址:https://www.cnblogs.com/kingangWang/p/2473120.html
Copyright © 2011-2022 走看看