使用C++开发dll供C#调用

使用C++封装dll供C#调用

-----写给熟练掌握C#但并不精通C++开发的程序员

程序源码下载见本文最后。如下载失效,请与本人联系。

开发环境:VS2010

感谢:

①C++下的Ini读取、写入:

https://https://www.360docs.net/doc/834621070.html,/Articles/12914/INI-Reader-Writer-Class-for-MFC-and-A NSI-C-Windows

②用C++创建DLL并用C#调用:

https://https://www.360docs.net/doc/834621070.html,/94cool/p/5772376.html

在我们开发的很多时候,都需要调用外部的dll方法,即DllImport方式。

外部的dll封装并公开了一些方法,方法的内部逻辑我们无从知晓,这些dll只有在特定的环境下(如有网络环境要求)才可以成功执行。往往一个业务流程就只因为某一个方法导致无法进行,这给我们的开发、测试带来了很多麻烦。

本人就遇到过这样的烦恼。我们的软件需要调用其他系统的接口,提供的接口就是某dll 内部的许多方法,dll方法内部需要连接专门的服务器进行数据处理。我们在程序中使用DllImport引用这些方法,然后再调用。当我们的程序开发完毕后,我们无法跳过这些dll的方法进行测试,如果需要测试就必须要到客户现场,因为需要专用的网络。当然现场测试是无法避免的,因为现场测试,环境更真实,数据更准确。但是,当我们确保了接口部分的调用正确无误后,我们程序内部的业务逻辑改动时,难道还需要到现场走一遍流程吗?

所以才有了本文。我们自己开发一个dll,替换接口的真实dll,程序的业务逻辑无需任何改动!

据调查,C#可以调用但写不出来那种DllImport方式调用的dll,C++可以。但是本人对C++并不熟悉,上网搜索一番,才摸索整理出了一套简单的方法,C++的dll程序只是中间的“过渡”程序,我们不需要精通使用C++。各位可以照着流程动手即可。运行时的流程图如下:

①主程序(即我们的业务程序)调用外部dll

②外部dll使用C++编写。将入参写入ini文件。并调用C#编写的另一个exe

③Interface.exe读取ini文件的数据,取得主程序的入参,并进行处理

④Interface.exe处理完数据后,将返参写入ini文件

⑤外部dll读取ini文件取得返参

⑥外部dll将返参返回给主程序

由于Interface.exe使用C#编写,我们可以很熟练的进行各种逻辑操作,也可以将各种运行中的数据写入DB供后续查询。不熟练的C++再也挡不住我们了。工程的结构:

目前HInterface.dll中已经定义了两个示例方法(test01、test02):

我们可以在CSharpCallDLL.exe中引用后调用(注意EntryPoint):

调用方式:

其中test01方法在HInterface.dll中的实现:

这个方法演示的是非常简单的调用,内部赋值后直接返回。

其中test02方法在Hinterface.dll中的实现。

第一步:

该方法入参较为复杂,是由很多个参数拼接组成,中间以[^]分隔。第0位为交易编码:wKeyName

第8位为参数的主要内容:wArgsValue

其他位的参数我们并不关注。

第二步:

加载ini文件,该文件路径已经在程序内部固定,可修改。

将入参写入Ini文件。如入参的交易编码wKeyName=2100,则保存位置的Section为Input,Key为2100:

第三步:

启动Interface.exe程序,并带入启动参数。然后等待其执行结束。

启动参数为交易编码wKeyName。

Interface.exe使用C#编写。启动时,首先根据启动参数读取ini文件配置,然后根据启动参数执行不同的处理,最后再将处理后的数据保存回ini文件。其中的逻辑处理可以简单,可以复杂,随心所欲!

第四步:

从ini文件读取Section为OutPut,Key为2100的数据,并赋值到outputData,即返回参数。

以上就是调用的简单过程。使用时,如果第三方dll的名字叫做abc.dll,那么我们在编写完我们的中间dll后,可以手动较名称变更,即HInterface.dll→abc.dll。

下面我们简单描述一下如何在HInterface新建一个接口方法test03。

第一步,在HInterface.dll的HInterface.def文件中增加一行代码:

第二步,为了简单起见,我们新建的方法直接返回入参。在HInterface.dll的HInterface.h 文件中增加方法的定义:

第三步,在HInterface.dll的HInterface.cpp实现该方法的具体逻辑:

第四步,编译该工程即可。

下面我们在C#程序中调用test03方法。

第一步,在类中申明方法:

第二个,调用即可:

可以看到入参为12,返参为12 + 100 = 112。

当然,test03只是一个非常简单的例子,复杂的例子如test02,照着这个思路,基本上可以解决大部分的问题了。

顺便贴上test03的非常简单的实现:

本人利用这个思路将订单数据保存到数据库,最后通过接口再将统计数据查询出来。

相关主题
相关文档
最新文档