`
johnney.r
  • 浏览: 15885 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C代码移植问题(请多多建议)

阅读更多

现在由于客户要求,需要把10几年以前写的代码(基于标准C)Vb.net调用,所以我们研究出两套方案.<o:p></o:p>

1.      将现有的C代码原封不动,直接封装成动态链接库.然后用Vb.net调用<o:p></o:p>

2.      先把C代码改造成C#代码(dllWebService程序),然后用Vb.net或者基于Web应用的程序调用。<o:p></o:p>

 现在我们偏重第二种,请问大家有什么建议?<o:p></o:p>

分享到:
评论
19 楼 iihero 2007-02-20  
johnney.r 写道
qiezi 写道
rtdb 写道
关键在于定义C的DLL的接口函数时,最好只使用最基本的数据类型做参数。
若是搞个结构什么的出来,就不好玩了。

所以应该包成.net类,在其它语言里调用就方便了。

是啊,现在我们就在改写.net类中,并且客户方的PM说在最终的C#代码中不允许出现 int,double,unsigned long之类的字眼,更不允许出现unsafe{}(所以无法自动生成了,只好自己写).
又是一段辛酸的旅程啊
我的建议是把它包装一个比较标准的C的dll,然后直接在VB.net里调用,在技术上是完全可以的,当然你如果觉得不好,可以包装成托管的.net dll.
C的dll可以直接在java里调用,即用jni小小包装一下。
我这里很多成熟的产品都是这么做的。
顺便透露一下,PowerBuilder的实现里大量采用了这种技术。
18 楼 johnney.r 2006-11-21  
qiezi 写道
rtdb 写道
关键在于定义C的DLL的接口函数时,最好只使用最基本的数据类型做参数。
若是搞个结构什么的出来,就不好玩了。

所以应该包成.net类,在其它语言里调用就方便了。

是啊,现在我们就在改写.net类中,并且客户方的PM说在最终的C#代码中不允许出现 int,double,unsigned long之类的字眼,更不允许出现unsafe{}(所以无法自动生成了,只好自己写).
又是一段辛酸的旅程啊
17 楼 johnney.r 2006-11-21  
rtdb 写道
关键在于定义C的DLL的接口函数时,最好只使用最基本的数据类型做参数。
若是搞个结构什么的出来,就不好玩了。

是啊,以前那些C代码的入口函数都有结构传进去,并且是嵌套的结构,子结构里面还有char* const*之类的元素.Dll导出时基本不可能,但又不能修改这些入口函数.
16 楼 qiezi 2006-11-20  
rtdb 写道
关键在于定义C的DLL的接口函数时,最好只使用最基本的数据类型做参数。
若是搞个结构什么的出来,就不好玩了。

所以应该包成.net类,在其它语言里调用就方便了。
15 楼 rtdb 2006-11-20  
关键在于定义C的DLL的接口函数时,最好只使用最基本的数据类型做参数。
若是搞个结构什么的出来,就不好玩了。
14 楼 johnney.r 2006-11-17  
zbird 写道
.net2.0调用dll比jni更方便。
直接用以下形式就可以了。
  [DllImport("des64.dll")]
  private static extern int b64_size(int lenth, uint option);

c#调用des64.dll进行加密解密
http://cache.baidu.com/c?word=c%23%2C%2Enet%3B2%3B%2E%3B0%2C%B5%F7%D3%C3%3Bdll&url=http%3A//www%2Ehhxxttxs%2Ecom/article/show%2Easp%3Fid%3D9517&b=65&a=18&user=baidu

谢谢你的建议,这种方法我们也会尝试的.希望能找到一条最快捷的方法.
13 楼 zbird 2006-11-17  
.net2.0调用dll比jni更方便。
直接用以下形式就可以了。
  [DllImport("des64.dll")]
  private static extern int b64_size(int lenth, uint option);

c#调用des64.dll进行加密解密
http://cache.baidu.com/c?word=c%23%2C%2Enet%3B2%3B%2E%3B0%2C%B5%F7%D3%C3%3Bdll&url=http%3A//www%2Ehhxxttxs%2Ecom/article/show%2Easp%3Fid%3D9517&b=65&a=18&user=baidu
12 楼 johnney.r 2006-11-17  
xiaoyu 写道
可以, JNI

ok,JNI刚才看了一下,的确可以实现dll的调用,只不过JNI对于调用C/C++的例子很多,但是对于调用.net的dll的例子不是很多.看来得先试试了.
11 楼 xiaoyu 2006-11-17  
可以, JNI
10 楼 johnney.r 2006-11-17  
qiezi 写道
johnney.r 写道
jack 写道
同意qiezi的做法,c++/CLI混合编译下你的c代码就可以了。然后直接就能够给其他的.net语言调用了。基本不会出错。

哦?那么用C++/CLI混合编译后,以什么形式提供给.net调用呢?比如说lib文件或者翻译成.net格式的文件.

应该是编译成.net的DLL格式,.net可以直接import一个DLL。

那么编译成.net格式的DLL后,可以直接用java代码调用这些dll吗?因为现在新需求里面需要用j2ee调用同样功能的代码?
9 楼 qiezi 2006-11-17  
johnney.r 写道
jack 写道
同意qiezi的做法,c++/CLI混合编译下你的c代码就可以了。然后直接就能够给其他的.net语言调用了。基本不会出错。

哦?那么用C++/CLI混合编译后,以什么形式提供给.net调用呢?比如说lib文件或者翻译成.net格式的文件.

应该是编译成.net的DLL格式,.net可以直接import一个DLL。
8 楼 johnney.r 2006-11-17  
新的问题又出现了,客户刚发来新的需求,他们希望在另外一个基于J2ee的项目中调用同样一个调度程序(也就是以前写的C程序)。彻底傻眼了,怎一个不爽了得.
有没有什么好的方法实现?
或者说实现起来很麻烦,找个什么理由回绝客户?
7 楼 johnney.r 2006-11-17  
jack 写道
johnney.r 写道
qiezi 写道
为什么要改造成C#?直接在VC.net中把C接口包装一下,一起编译成.net库就可以吧。

这个是我们的第一个方案,但是这个方案或许有几个缺点:
1.直接把C代码包装的话,指针的问题必须考虑.因为Vb.net和C#中都是使用安全代码的.大家都不希望被
.net解释成 unsafe{}这样的代码。
2.直接把C封装成动态链接库的话,用C#.net可以调用.但是VB.net不一定能够调用,因为Vb.net需要在
DllExport的时候必须传出一个参数,否则无法调用.
3.如果改写成C#的话,对后期的开发维护很方便,因为同在.net环境中跟踪调试很方便.而C代码原样照搬会有问题.

上面是我的拙见,或许分析的不对.请多多建议.先谢谢啦.


我到是觉得不要考虑那么多,每种方案尝试下,也花不了几天时间。完全改写的话,所费时间多了。不如多试试

好的,谢谢你的建议.我马上安排人用这种方案尝试.或许会有新的发现 .因为时间对我们来说现在很重要.
6 楼 johnney.r 2006-11-17  
hurricane1026 写道
qiezi 写道
为什么要改造成C#?直接在VC.net中把C接口包装一下,一起编译成.net库就可以吧。我自己没做过,以前一个项目中让一个同事在vc.net中把cpython简单包装了下,然后在C#中直接调用,要写的代码很少。结果很成功,可以用python脚本控制一个C#游戏界面,不过可惜同事因此而投入.net阵营,不久就离开公司了,都是我的错。。。

这个用不着自责吧。用什么语言不也是programmer?java和.net也没有不共戴天吧。

呵呵,或许他这个同事比较优秀,并且还是自己带出来的.
5 楼 jack 2006-11-17  
johnney.r 写道
qiezi 写道
为什么要改造成C#?直接在VC.net中把C接口包装一下,一起编译成.net库就可以吧。

这个是我们的第一个方案,但是这个方案或许有几个缺点:
1.直接把C代码包装的话,指针的问题必须考虑.因为Vb.net和C#中都是使用安全代码的.大家都不希望被
.net解释成 unsafe{}这样的代码。
2.直接把C封装成动态链接库的话,用C#.net可以调用.但是VB.net不一定能够调用,因为Vb.net需要在
DllExport的时候必须传出一个参数,否则无法调用.
3.如果改写成C#的话,对后期的开发维护很方便,因为同在.net环境中跟踪调试很方便.而C代码原样照搬会有问题.

上面是我的拙见,或许分析的不对.请多多建议.先谢谢啦.


我到是觉得不要考虑那么多,每种方案尝试下,也花不了几天时间。完全改写的话,所费时间多了。不如多试试
4 楼 johnney.r 2006-11-17  
jack 写道
同意qiezi的做法,c++/CLI混合编译下你的c代码就可以了。然后直接就能够给其他的.net语言调用了。基本不会出错。

哦?那么用C++/CLI混合编译后,以什么形式提供给.net调用呢?比如说lib文件或者翻译成.net格式的文件.
3 楼 johnney.r 2006-11-17  
qiezi 写道
为什么要改造成C#?直接在VC.net中把C接口包装一下,一起编译成.net库就可以吧。

这个是我们的第一个方案,但是这个方案或许有几个缺点:
1.直接把C代码包装的话,指针的问题必须考虑.因为Vb.net和C#中都是使用安全代码的.大家都不希望被
.net解释成 unsafe{}这样的代码。
2.直接把C封装成动态链接库的话,用C#.net可以调用.但是VB.net不一定能够调用,因为Vb.net需要在
DllExport的时候必须传出一个参数,否则无法调用.
3.如果改写成C#的话,对后期的开发维护很方便,因为同在.net环境中跟踪调试很方便.而C代码原样照搬会有问题.

上面是我的拙见,或许分析的不对.请多多建议.先谢谢啦.
2 楼 jack 2006-11-17  
同意qiezi的做法,c++/CLI混合编译下你的c代码就可以了。然后直接就能够给其他的.net语言调用了。基本不会出错。
1 楼 qiezi 2006-11-17  
为什么要改造成C#?直接在VC.net中把C接口包装一下,一起编译成.net库就可以吧。我自己没做过,以前一个项目中让一个同事在vc.net中把cpython简单包装了下,然后在C#中直接调用,要写的代码很少。结果很成功,可以用python脚本控制一个C#游戏界面,不过可惜同事因此而投入.net阵营,不久就离开公司了,都是我的错。。。

相关推荐

    LINUX系统移植及UBOOT代码分析.zip

    Linux系统移植 目 录 第一部分 前言....................................................................................................................................8 1 硬件环境.........................

    嵌入式Linux系统移植步步通

    2.2.3 内核及应用程序移植工作...........................................................................................9 2.3 配置系统服务..................................................................

    毕业设计-c语言地空对战游戏源码

    1. **C语言基础**:C语言是一种低级编程语言,具有高效、灵活和可移植性等特点。源码中会涉及到基本的数据类型(如int, char, float等)、控制结构(如if-else, for, while循环)、函数定义和调用、指针操作等。 2....

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    McGraw C++程序调试实用手册

    3.6 “请多多支持” 3.7 Microsoft Visual C++的帮助 3.8 小结 第4章 debugger 4.l 确认Debugger可以使用 4.2 启动Debugger 4.2.1 Step Into和Step Over的区别 4.2.2 Go 4.2.3 Run to Cursor 4.3 理解...

    高仿版百度地图基于iOS SDK v2.5.0,功能完善!

    代码打包后大小是15.3 MB,论坛文件限制大小只有4MB,没办法我只有传到CSDN上,设置下载分5分的原因是设置点障碍,防止新手乱下载,乱转载不注明出处,Android版当时就出现了这样的情况,我是支持大家相互交流的,...

    51单片机使用点滴经验

    此外,作者还建议平常多做设计练习,多学多看,尤其要多多地收集别人公开的驱动源程序,这样可以在设计的时候少写很多代码。设计完成后,需要结合电路图和代码写出设计说明书,这样可以很好地保存自己的设计思路,对...

    基于EasyARM1138的UART控制台应用程序

    包含有需求分析文档、编程规范、设计文档、用户使用手册、移植代码、完整代码等等,由四川大学锦城08级嵌入式方向全部同学共同完成。代码或文档有什么不好的地方,希望高手能多多指导或留言,我们都是初学者,来言...

    grub4dos-V0.4.6a-2017-02-04更新

    FDD 模式的 u 盘被识别为硬盘,问题多多。已经发现的问题是执行 find,不返回 (hd0);精简 PE 加载映像文件死机。 2.解决了FDD 模式的 u 盘,执行 find 时返回 (fd0,n) 的问题。 3.修正了 menu.lst 中 0PE.ISO ...

    无线收发模块24L01详细资料

    C语言因其易读性和可移植性,通常被首选用于编写应用程序。开发过程中,开发者需要理解如何配置模块的各个寄存器,如配置发射功率、设置通信频道、设定CRC校验等。同时,还需要处理好数据的发送与接收,包括正确设置...

    51单片机中各种小例子的hex文件

    而C语言则是一种高级语言,它具有丰富的库函数和结构化编程特性,使得程序编写更为简洁,同时也更易于移植到其他平台。 在描述中提到的“流水灯”例子,是电子工程和单片机学习中常见的实验项目。流水灯通常是指一...

    xv6-improved:最低操作系统

    计划 先说说我的几个计划制定的Guideline吧。这样大家好理解我为什么那么决定。 首先,我个人认为我们...在系统调用完成的基础上,实现(或适应现有的开源实现)标准C语言库函数,细长讲现有的开源软件顺利的移植到xv6

    74HC595.rar

    压缩包内的"hc595.c"和"hc595.h"文件,分别包含了驱动74HC595的源代码和头文件。在"hc595.h"中,你可能会看到关于74HC595引脚的定义以及相关配置结构体,而在"hc595.c"中则实现了串行传输数据到74HC595的函数,如`...

    使用51单片机应注意的

    4. 多做设计练习:平常多做设计练习,多学多看,尤其要多多地收集别人公开的驱动源程序,这样可以在设计的时候少写很多代码。 5. 设计完成后要写出设计说明书:设计完成后,要结合电路图和代码写出设计说明书,这样...

Global site tag (gtag.js) - Google Analytics