C++和C#之间互相调用经验详谈
作者:网络转载 发布时间:[ 2014/1/23 9:28:24 ] 推荐标签:C++ C#
先说说程序大概组织逻辑。主程序有一套公用接口(其实是纯虚类),在加载DLL时候将此接口传到DLL中,这样子模块在需要的时候可以调用父的逻辑了,至于父调子,那更简单了,主程序有一个纯虚类,子模块都继承此接口,并进行重写,主程序按照一定的顺序分别调用,这样父与子的逻辑交互完成了,这些对都是C++程序来说,这当然没问题。现在问题是,要嵌入.NET的类库,由此引发一系列问题。。。。。
软件是以C++为父,DLL作为子的项目。
开发环境:WIN7 64BIT+VS2010+MFC+ATL+COM。
.NET环境下先以C#为例,其他的大部分一样下,不排除做一些简单或者复杂的修改。
下面正式开始把。
1. 动态加载 即父调子。
COM确实是好东西(他的褒与贬我们无作评论),她的语言无关性,不仅是我们实现动态加载的关键,更是实现加载其他.NET类库的核心。如VB.NET。有了她,才是这一切皆有可能。
由于.NET下的类库(DLL),和传统的WIN DLL 不太一样,毕竟托管的东西。她一些函数对外是不可见的,但对COM可见。因为我们以COM方式定义一套接口,并把此接口当成普通C++的纯虚接口,来完成父到子的调用。
这一点不论在理论上、代码上都比较简单,而且网上大多也是这样子,所以我们直接上代码。
如下为COM接口定义。
[ComVisible(true),
Guid("B86D71F4-FE07-4B60-8246-F5AE283ED2A3"),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IHMI
{
[PreserveSig, DispId(1)]
void OnCreate(int a);
[PreserveSig, DispId(2)]
void SetRect(int left, int top, int width, int height);
//其他接类似
}
[ ComVisible(true),
ClassInterface(ClassInterfaceType.AutoDual),
ProgId("xxxxxxx.xxxxxxx") //ProgId 主程序根据此,运行时动态创建。
]
C#在使用时要继承并实现接口逻辑,如下类似。
public class CustomCOMClient : IHMI
{
public CustomCOMClient()
{
}
[DispId(1)]
public void OnCreate(int a)
{
//逻辑
}
[DispId(2)]
public void SetRect(int left, int top, int width, int height)
{
//逻辑
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11