zoukankan      html  css  js  c++  java
  • [转]VC调用C#的COM组件(DLL)

     

    假设要进行二次开发的程序为 A.exe,要增加的功能使用增加DLL的方法来完成,设为Cdll.DLL,其中含有A、B、C等方法。

           其中的方法A要用到C#类库Csharp.DLL中的方法A。要完成这个任务,参考网络上的各种方法与代码,总结其步骤如下:先用VS2008 C#类库项目写成含有A方法的DLL,并设置项目属性以进行COM的封装,然后用VC6 等写C代码进行调用。

    一、生成C#类库 Csharp.DLL

    (1)在Visual Studio 2008 中创建C#的类库项目 CSharp

    (2)实现的类假设为:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Runtime.InteropServices;//必须引用此空间

    namespace CSharp

    {

        [Guid("4BF1CE-F33D-48bd-A8-C4E8EE7376B1")]

        public interface iClass1

        {

            string A();

        }

        [Guid ("39BE150B-768416-957415BDE407")]

        [ClassInterface(ClassInterfaceType.None)]

        public class Class1 : iClass1

        {

            public string A()

            {

                return "测试字符串A";

            }

        }

    }

    /*通过菜单的 “工具/创建 GUID”。注意要选择Define Guid{….}格式

    * 例如:

    // {4BF1CE-F33D-48bd-A8-C4E8EE7376B1}

    DEFINE_GUID(<<name>>,

    0x4bf1ce, 0xf33d, 0x48bd, 0xa7, 0xc8, 0xc4, 0xe8, 0xee, 0x73, 0x76, 0xb1);

    // {39BE150B-768416-957415BDE407}

    DEFINE_GUID(<<name>>,

    0x39be150b, 0x7684, 0x16, 0x95, 0x74, 0xf, 0x, 0x15, 0xbd, 0xe4, 0x7);

    */如果要增加其他方法,可如法炮制。

    (3)COM生成设置(管理员权限)

    配置:选择项目“属性”,选择“生成”,选择“为COM 互操作注册”

    打开AssemblyInfo.cs文件,设置 [assembly: ComVisible(true)]

    这样就可以生成CSharp.tlb文件

    (4)生成解决方案

    生成Csharp.DLL和Csharp.tlb即可。

    二、生成C或C++的 Cdll.DLL

    下面这个是测试程序,用来测试所写的C# COM组件是否正常。在VC6.0中测试

    #include "stdafx.h"

    #import "CSharp.tlb"//1、导入类型库tlb

    using namespace CSharp;//下面COM初始化中可以不用写命名空间

    void main()

    {    CoInitialize(NULL);// 2、初始化COM以及产生智能指针

        iClass1Ptr p(__uuidof(Class1));//命名规则:接口Ptr p((__uuidof(类)))

    //3、调用COM中的方法

        _bstr_t pt=p->A();//这个方法返回 string类型.可以根据IDE的提示设置类型

         printf(pt);

        CoUninitialize(); //4、释放环境

    }

    如果测试正确,那么使用 Visual Studio C++ 6.0 ,创建C++类库项目 Cdll。

    定义def 文件如:

    LIBRARY Cdll

    EXPORTS

    A

    定义Cdll.cpp文件如:

    #include<stdio.h>

    #import "CSharp.tlb"

    using namespace CSharp;

    void A()

    {

           CoInitialize(NULL);

         iClass1Ptr p(__uuidof(Class1));

         _bstr_t pt=p->A();

           printf(pt);

         CoUninitialize();

    }

    当然,要把Csharp.DLL和Csharp.tlb放到工程文件夹中。

    这样最终得到 Cdll.dll和Cdll.lib 两个文件。

    C#的COM组件是一个DLL形式的文件,那么能不能像其他DLL一样如系统 kernel32.dll 直接在C代码(或C++代码)中使用呢?也就是不通过COM的封装而是直接使用。这样做是行不通的。因为C#的类库必然是托管类库,虽然文件扩展名也是DLL,但它不是一种传统意义上的DLL,例如没有输出表,所以得经过COM封装才能给非托管代码使用。至于托管代码使用托管DLL 如C#调用C#写的类库那就没必要经过COM的封装了。

    http://hi.baidu.com/nqvwvvwfoybcdfr/item/eb671306f50944e1f55ba6ed

  • 相关阅读:
    市场规模的估算
    C#中的线程(一)入门 转载
    2.设计模式-Abstract Factory 抽象工厂模式
    1.设计模式
    Microsoft.Jet.OLEDB.4.0读取EXCEL数据
    转载--加盐密码哈希:如何正确使用
    ragel学习资源整合
    开源库xlslib跨平台编译
    WPF开源框架以及经典博客
    (转载)值得推荐的C/C++框架和库 (真的很强大)
  • 原文地址:https://www.cnblogs.com/citymap/p/3169644.html
Copyright © 2011-2022 走看看