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("4BF8F1CE-F33D-48bd-A7C8-C4E8EE7376B1")]

    public interface iClass1

    {

        string A();

    }


    [Guid ("39BE150B-7684-4a16-9574-0F6C15BDE407")]

    [ClassInterface(ClassInterfaceType.None)]

    public class Class1 : iClass1

    {

        public string A()

        {

            return "测试字符串A";

        }

    }

}

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

* 例如:

// {4BF8F1CE-F33D-48bd-A7C8-C4E8EE7376B1}

DEFINE_GUID(<<name>>,

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


    // {39BE150B-7684-4a16-9574-0F6C15BDE407}

DEFINE_GUID(<<name>>,

0x39be150b, 0x7684, 0x4a16, 0x95, 0x74, 0xf, 0x6c, 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的封装了。



2.

C# dll封装winform  

2013-06-17 09:03:23|  分类: VC#技术|举报|字号 订阅

1. 建立一个新工程。(相信这个你会)
2. 编辑你需要的窗体。(相信这个你也没有问题)
3. 运行,调试。保证你的窗体功能正常了。(别嫌我罗嗦哦^^)
4. 在你的“解决方案”面板上(如果没有,就点Ctrl-Alt-L),找到你的工程(默认是第二行)。点击鼠标右键。
5. 点击“属性”菜单项。
6. 如果是2003,会出来一个对话框。如果是2005,会在编辑代码的那里新出来一页。但是内容都是类似的。
7. 现在找到“输出类型”,下拉框中得值应该是“Windows Application”,现在改成“Class Library”。
8. 点击“确定”(2003)或 Ctrl-S(2005)来保存修改。
9. Ctrl-Shift-B,来重新编译。
10. 好了,你现在在工程文件的bin\Debug 或者 bin\Release中找到编译好的dll了。

现在你需要记住三件事:
1. dll的文件路径。
2. 你编辑的窗体的命名空间(namespace)。
3. 你编辑的窗体的类名。

好了,现在开始引用:
1. 创建好一个新的工程。
2. 在你的“解决方案”面板上(如果没有,就点Ctrl-Alt-L),找到References(默认是第三行),点击右键。
3. 选择“添加引用...”菜单项。
4. 会弹出一个对话框。点击Borwse,找到你刚才写的那个dll文件。打开。
5. 现在,在对话框的列表中找到你刚刚打开的那个dll的名字。点击“选择”按钮。
6. 点击“确定”按钮,关闭对话框。

好了,现在就可以使用你封装的窗体了。
1. 在要调用窗体的文件里应用你封装的窗体的命名空间。就是
using .......;
2. 就像使用其它类一样,开始使用你的窗体吧。


--------------------------

 

C#怎么调用C#DLL封装好的窗体

//假设你已经做好了Form1在test.dll里
//首先你要在解决方案资源管理器,右击“引用”,选择“添加引用”。
//然后在浏览的那个页里找到test.dll,再点确定。
//最后假设你的Form2定义在名叫test的命名空间。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using test;

//创建一个简单的windows应用程序
namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            //显示Form1
            Form1 myForm = new Form1();
            myForm.Show();
            //如果想先关掉Form2再处理后面的窗体,请把myForm.Show()改成myForm.ShowDialog();
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值