BCB6 调用C# DLL
最近项目涉及第三方接口调用。第三方是用C#实现的WCF服务。而我们的程序是使用的BCB6开发。因此,打算将与WCF的通讯包含在C#的类库中,给BCB6调用。BCB6 是无法直接调用C#的DLL,但可以通过C#编写一个COM组件,然后BCB调用这个COM组件来调用。
- 用C#编写COM
大体步骤是
- 新建一个类库项目
|
|
- 设置Assemblyinfo.cs

- 设置项目属性

- 编写代码
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; //1添加Rumtime.InteropServices 程序集引用 using System.Windows.Forms; //2为了演示,所以加入了forms引用 namespace ComImpTest { [Guid("3CD116D4-18A1-4504-921B-57C053BAD618")] //3主菜单->工具->创建GUID产生 public interface IComInterface //4必须先定义接口 { [DispId(1)] //5每一个函数或者属性都需要指定DispID void Hello(string name); [DispId(2)] int Add(int x,int y); [DispId(3)] string COMINFO{get;} } [Guid("1A8EB38C-E732-49B2-A897-B40FFD744E3D")] public class ComImp : IComInterface //6编写一个实现接口的类 { public void Hello(string name) { Console.WriteLine("你好"+name); MessageBox.Show("你好"+name,"C# dll 弹出界面"); } public int Add(int x, int y) { return x + y; } public string COMINFO { get { return "com 测试"; } } } } |
- 编译得到DLL 和 TLB

- BCB编写调用
- 首先BCB的开发环境中需要安装.NET FrameWork ,这里都是用的.NET FrameWork 4.0,安装之后,
在如图的目录会得到RegAsm.exe(一定要用安装后得到的RegAsm 从其他地方复制的RegASM可能存在版本不兼容),
这个在注册COM的时候要用到。

- 建立一个BCB控制台工程
- 吧RegAsm.exe(我们是为了注册方便),前面编译得到的 ComImpTest.tlb 、ComImpTest.dll 复制到BCB工程的EXE
输出目录。(这也不是必须的,本质上COM只要能注册,然后BCB功能能找到TLB创建代理类即可)

- 用管理员启动命令行,注册ComImpTest.dll

其本质是吧这个COM类注册到了注册表中。向系统进行了发布。
- 用BCB 产生代理类
打开BCB 工程,选择主菜单 projectàimport type library



得到代理类

包含这个头文件,我们就可以调用了。
但是这里不知道是BCB的bug,还是兼容性的问题,BCB产生的ComImp代理类的GUID是错误的。

正确的GUID 应该是编写C#dll 时产生的Guid
|
[Guid("1A8EB38C-E732-49B2-A897-B40FFD744E3D")] |
我们只需要替换这个Guid即可,如果不这么做,调用时HRESULT会返回找不到实现接口。

- BCB 调用COM的代码
- 在控制台工程中,加入代理类的头文件 ComImpTest_tlb.h
- 代码如下
|
//--------------------------------------------------------------------------- #pragma hdrstop #include <iostream> #include <vcl.h> //注意,iostream要在 vcl.h 前面定义,否则cout<<AnsiString 报错 #include "Comimptest_tlb.h" using namespace std; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { HRESULT hr; //初始化COM CoInitialize ( NULL ); //创建智能指针命名空间在头文件Comimptest_tlb.h中可以查找到 //接口智能指针的定义也能查找到 Comimptest_tlb::IComInterfacePtr ptr; //创建实例,ComImp 的声明,也能在头文件中查找到。 hr = ptr.CreateInstance(__uuidof (Comimptest_tlb::ComImp)); if(hr == S_OK) { //调用ADD方法 cout << ptr->Add (1, 2)<<endl; //调用Hello方法,在bcb中Widestring 对应 c#的 string WideString name = "Zakk wylde 和奥兹"; ptr->Hello(name.c_bstr()); //调用COMINFO属性,这里COM进行了名字改变,这些函数都可以在头文件中查到原型定义。 BSTR outp = NULL; ptr->get_COMINFO(&outp); //因为是宽字符,所以要转换为AnsiString进行输出 cout<<AnsiString(outp)<<endl; } CoUninitialize (); system("pause"); return 0; } |


4 用vc调用COM
用VC调用C#的COM 就没有这么多事情。下面是VC调用的代码,
将ComImpTest.tlb 和 ComImpTest.dll 拷贝到 VC工程的debug目录下。然后用import指令(BCB 无法用import识别,估计是不兼容)
// testCOM3.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
#import "../debug/ComImpTest.tlb" int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr;
//初始化COM
CoInitialize ( NULL );
//创建智能指针
ComImpTest::IComInterfacePtr ptr; //创建实例
hr = ptr.CreateInstance(__uuidof (ComImpTest::ComImp)); if(hr == S_OK)
{
cout << ptr->Add (,)<<endl;
ptr->Hello(L"VC++ 调用");
cout<<ptr->COMINFO<<endl;
} CoUninitialize ();
system("pause");
return ;
} //---------------------------------------------------------------------------
BCB6 调用C# DLL的更多相关文章
- c# 调用c++DLL方法及注意事项
引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...
- 在.net中调用Delphi dll的Pchar转换
Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- C#调用C++ DLL类方法
C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题. C++生成的D ...
- paip.java 调用c++ dll so总结
paip.java 调用c++ dll so总结 ///////JNA (这个ms sun 的) 我目前正做着一个相关的项目,说白了JNA就是JNI的替代品,以前用JNI需要编译一层中间库,现在JNA ...
- C#调用C++ DLL 文件
说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...
- LR调用动态链接库DLL
什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...
- C#调用C++ Dll
现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...
- 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)
OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...
随机推荐
- Egret入门学习日记 --- 第十一篇(书中 4.1~4.6节 内容)
第十一篇(书中 4.1~4.6节 内容) 好了,到了这篇开始,前三章都记录完了. 接下来就是到第四章了. 4.1节 的内容总结一下重点: 1.resource目录下default.res.json文件 ...
- 一次Python爬虫的修改,抓取淘宝MM照片
这篇文章是2016-3-2写的,时隔一年了,淘宝的验证机制也有了改变.代码不一定有效,保留着作为一种代码学习. 崔大哥这有篇>>小白爬虫第一弹之抓取妹子图 不失为学python爬虫的绝佳教 ...
- 【计算机视觉】OpenCV读取视频获取时间戳等信息(PS:经测试并不是时间戳,与FFMPEG时间戳不一样)
OpenCV中通过VideoCaptrue类对视频进行读取操作以及调用摄像头,下面是该类的API. 1.VideoCapture类的构造函数: C++: VideoCapture::VideoCapt ...
- AutoMapper扩展帮助类
/// <summary> /// AutoMapper扩展帮助类 /// </summary> public static class AutoMapperExtension ...
- 携程Apollo统一配置中心的搭建和使用
原文链接:https://blog.csdn.net/luhong327/article/details/81453001 一.Apollo配置中心介绍 1.What is Apollo 1.1 Ap ...
- 图说socket与系统调用代码架构
1.引言 正式开始之前,每个人心里都应该有一点逼数,就像下面这张图一样. 系统调用也是函数调用,系统函数也是函数代码.系统函数与普通函数唯一的不同在于,系统函数可以使用cpu体系结构指令集中的特权指令 ...
- 猴子补丁(Monkey Patching)
猴子补丁是我在面试的时候接触的一到题,学python的时候,我根本就没有听说这个概念!那接下来我们来分析一下: 1.什么是猴子补丁? 2.猴子补丁的功能? 3.猴子补丁的应用场景? 一.什么是猴子补丁 ...
- ORA-16401: archivelog rejected by RFS
ORA-16401: archivelog rejected by RFS 无线出单系统邮件告警10.111.20.1 1. 报错 SYS > ! oerr ora 16041 1604 ...
- ( 十二)Json的使用(上)
一.什么是JSON 1.1 javaScript中定义对象的几种方式 使用内置对象 自定义对象构造 使用JSON符号 (1)使用内置对象 JavaScript可用的内置对象可分为两种: 1,Java ...
- jQuery_jQuery的基本使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
