VC调用C#的COM组件(DLL)
2012-08-14 16:37
274 查看
VC调用C#的COM组件(DLL)
转载地址:http://hi.baidu.com/hot_blood2001/blog/item/0454e880ccc9ffdc9023d94c.html
2010年03月11日 星期四 13:42
转载地址:http://hi.baidu.com/hot_blood2001/blog/item/0454e880ccc9ffdc9023d94c.html
2010年03月11日 星期四 13:42
假设要进行二次开发的程序为 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的封装了。 |
相关文章推荐
- VC调用C#的COM组件(DLL)
- VC调用C#的COM组件(DLL)
- VC调用C#的COM组件(DLL)笔记
- C#调用VC的DLL的接口函数参数类型转换一览表_蓝竹傲雪
- VC 调用C#写的COM组件注意事项
- VC调用C#的DLL
- VC++调用C#生成DLL的两种方法!
- VC++ 调用 C#生成DLL的两种方法
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- VC/C#调用lazarus写的dll
- C#调用VC的DLL的接口函数参数类型转换一览表
- VC DLL内封装MicroDraw ActiveX控件;C#内再调用DLL
- 关于C#动态调用VC Dll的方法(转)
- C#调用VC DLL接口函数参数类型转换方法介绍
- C#调用VC的DLL的接口函数参数类型转换一览表
- vc2005 调用c#dll