VoiceTracking是公司其他部门的同事做的。本人只负责开发voicetracking 的界面部分。
先上个效果图
根据声源位置指针移动。因为是第一次用C#做东西,所以很多东西比较基础,大家勿喷。
1. C#调用C++写的接口。-- 原则:是越简单的接口越不容易出错
网上的这部分资料很多,这里就不写怎么去实现简单的接口调用了。说下要注意的地方,首先,要明白C#和C++是不同的平台,内存管理机制不一样,一个托管一个非托管,那么,在内存管理这块一定要注意。比如C++中有一个接口是用回调函数实现的,对C#和C++单独而言,回调都是很方便的,但是在一起,就容易出问题。比如我有回调函数
public delegate void WENUM_CALLBACK([MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]byte [] name, IntPtr param);
name 是C++以字符串形式传给C#的,C++的接口代码如下
typedef void (__stdcall *ENUM_CALLBACK)(const wchar_t *name, void *param);
开发过程中(主要使用DEBUG模式),各种正常,在测试的时候,报错,提示Read or write protected memory. 就是由于C++传给C#的常量字符串出的问题。
要下班。先写到这里
继续。整了不少时间才把接口都弄好。C#的代码编写倒是很简单,UI部分的直接在选项里修改就好了。如果有些需要定制的控件,集成那个类别的就可以。
2. 日志是很关键的东西 ---真的是非常关键
尤其是当你的测试机无法debug的时候,你可以通过日志来定位哪里的问题,日志做成宏开关形式的
#define _LOG_ENALBED
#if defined _LOG_ENALBED
FILE * f = NULL;
#define LOG_OPEN(r) fopen_s(f, r, "a+")
#define LOG(r) fprintf(f, r);
#define LOG_CLOSE() fclose(f)
#else
#define LOG_OPEN(r)
#define LOG(r)
#define LOG_CLOSE()
#endif
上面只是表示一下用法。因为上面的日志没有把时间这个关键的变量加进去,感兴趣的同学可以自己写个日志,使用C的<time>库函数获取local time。
3. 单元测试也很重要
这个东西对越是大的项目,重要性越强,写单元测试,会增加开发成本30%-40%。但是总体效率会提高60%。这个数据是老外统计的,如果只是很简单的东西,单元测试不必要那么严格,但总是需要的。
4. 代码风格
CPPLint是一个好的选择,当然需要自己定制一下,比如如果你用VS的IDE,{一定是在一行的开头,如果全按照CPPLint的要求,那是满眼的warning啊。
5. 软件做好了,需要打包发布--个人推荐使用Inno Setup
这个东西很小巧,而且容易使用。有些童鞋会用VS的IDE带的Setup程序,个人感觉功能虽强大,速度稍微有点慢。《---我的这个程序是用VS2012做的,安装了一个近200M的InstallShield,建了Setup工程,到生成release的时候居然有锁,还要序列号,狂晕。然后把代码拷到VS2005下面去弄了个build,安装包是两个文件一个依赖文件夹。最后倒腾来倒腾去,感觉还是Inno Setup简单好用。
上一个Inno Setup的图
恩。看起来有点头疼是吧。其实只要打开程序,点左上角的File->New,按照模板一步步来,基本的功能需求都能实现。