c翻译成c#问题,请问这个应该如何翻译,谢谢各位大神

qq_39595118 2017-07-25 12:44:07

typedef int ( *GrammarCallBack)( int, const char*, void*);

int MSPAPI QISRBuildGrammar(const char *grammarType, const char *grammarContent, unsigned int grammarLength, const char *params, GrammarCallBack callback, void *userData);
typedef int (MSPAPI *Proc_QISRBuildGrammar)(const char *grammarType, const char *grammarContent, unsigned int grammarLength, const char *params, GrammarCallBack callback, void *userData);

typedef struct _UserData {
int build_fini; //标识语法构建是否完成
int update_fini; //标识更新词典是否完成
int errcode; //记录语法构建或更新词典回调错误码
char grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID
}UserData;
=============================================上面是c的代码
=============================================下面是我写的c#,但是会有内存错误
public class QISRDLL
{
public struct UserData {
public int build_fini; //标识语法构建是否完成
public int update_fini; //标识更新词典是否完成
public int errcode; //记录语法构建或更新词典回调错误码
public string grammar_id; //保存语法构建返回的语法ID
};


//
#region ISR dllimport

[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
static extern int QISRBuildGrammar( string grammarType,ref string grammarContent, ref int grammarLength, ref string grammar_params, build_grm_cb call,ref UserData ud);

[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
static extern int MSPLogin(string user, string password, string configs);

[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]
static extern int MSPLogout();

#endregion

static int MSP_SUCCESS = 0;



public delegate int build_grm_cb(int ecode, string info, ref UserData ud);


public int bg(int ecode, string info, UserData ud)
{

return 0;
}

public int build_grammar()
{
//
return 0;
}

public static int msplogin()
{
string login_config = "appid = 58e02a9b"; //登录参数

int ret = 0;

ret = MSPLogin("", "", login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数
if (MSP_SUCCESS != ret)
{
//printf("登录失败:%d\n", ret);
//goto exit;
}
return ret;
}
static public UserData getUserData()
{
return new UserData
{
build_fini = 0,
update_fini = 0,
errcode = -1,
grammar_id = ""

};
}
public static int build_gm()
{
//
build_grm_cb myDelegate = new build_grm_cb(CallbackFunc);
UserData bgdata = getUserData();

string grm_content = File.ReadAllText(@"call.bnf");
int grm_cnt_len = System.Text.Encoding.Default.GetBytes(grm_content).Length;
string grm_build_params = "engine_type = local, asr_res_path = fo|res/asr/common.jet, sample_rate = 16000,grm_build_path = res/asr/GrmBuilld, ";
int ret = QISRBuildGrammar("bnf",ref grm_content, ref grm_cnt_len,ref grm_build_params, myDelegate,ref bgdata);
//上面这句就是问题所在
return ret;
}

public static int CallbackFunc(int ecode, string info, ref UserData ud)
{
Console.WriteLine("参数1: {0}", ecode);
Console.WriteLine("参数2:{0}", info);

return 0;
}

}
...全文
293 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪子-无悔 2017-07-26
  • 打赏
  • 举报
回复
引用 3 楼 qq_39595118 的回复:
搞好了,以免有其它人在这个头文件上浪费时间,下面会贴出代码,已经过编译 =================================================================== using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.IO; //namespace IFlyDoNetApi.Utility namespace WindowsFormsApplication5 { public class QISRDll { public const int MSP_SUCCESS=0; /// <summary> ///声明QISRBuildGrammar离线调用的委托 /// </summary> /// <param name="ecode"></param> /// <param name="info"></param> /// <param name="udata"></param> /// <returns></returns> public delegate int GrammarCallBackDelegate(int ecode, string info, ref UserData udata); //声明委托 /// <summary> /// 声明QISRUpdateLexicon离线调用的委托 /// </summary> /// <param name="ecode"></param> /// <param name="info"></param> /// <param name="udata"></param> /// <returns></returns> public delegate int LexiconCallBackDelegate(int ecode, string info, ref UserData udata); //声明委托 [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int MSPLogin(string user, string password, string configs); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int MSPLogout(); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern string QISRSessionBegin(string grammarList, string param, ref int errorCode); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRAudioWrite(string sessionID, IntPtr waveData, uint waveLen, int audioStatus, ref int epStatus, ref int recogStatus); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern string QISRGetResult(string sessionID, ref int rsltStatus, int waitTime, ref int errorCode); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRSessionEnd(string sessionID, string hints); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRGetParam(string sessionID, string paramName, StringBuilder paramValue, ref uint valueLen); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRBuildGrammar(string grammarType, string grammarContent, uint grammarLength, string param, GrammarCallBackDelegate callback, ref UserData userData); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRUpdateLexicon(string lexiconName, string lexiconContent, uint lexiconLength, string param, LexiconCallBackDelegate callback, ref UserData userData); public static int build_grm_cb(int ecode, string info, ref UserData udata) { return 0; } public static int update_lex_cb(int ecode, string info, ref UserData udata) { return 0; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct UserData { public int build_fini; //标识语法构建是否完成 public int update_fini; //标识更新词典是否完成 public int errcode; //记录语法构建或更新词典回调错误码 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string grammar_id; //保存语法构建返回的语法ID } public static int msplogin() { string login_config = "appid = 58e02a9b"; //登录参数 int ret = 0; ret = MSPLogin("", "", login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数 if (MSP_SUCCESS != ret) { //printf("登录失败:%d\n", ret); //goto exit; } return ret; } public static int build_gm() { // GrammarCallBackDelegate myDelegate = new GrammarCallBackDelegate(CallbackFunc); UserData bgdata = getUserData(); string grm_content = File.ReadAllText(@"call.bnf"); uint grm_cnt_len = (uint)System.Text.Encoding.Default.GetBytes(grm_content).Length; string grm_build_params = "engine_type = local, asr_res_path = fo|res/asr/common.jet, sample_rate = 16000,grm_build_path = res/asr/GrmBuilld, "; int ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, myDelegate, ref bgdata); return ret; } public static int CallbackFunc(int ecode, string info, ref UserData ud) { Console.WriteLine("参数1: {0}", ecode); Console.WriteLine("参数2:{0}", info); return 0; } static public UserData getUserData() { return new UserData { build_fini = 0, update_fini = 0, errcode = -1, grammar_id = "" }; } } }
不是翻译的很好嘛!!!哈哈~~~
qq_39595118 2017-07-26
  • 打赏
  • 举报
回复
搞好了,以免有其它人在这个头文件上浪费时间,下面会贴出代码,已经过编译 =================================================================== using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.IO; //namespace IFlyDoNetApi.Utility namespace WindowsFormsApplication5 { public class QISRDll { public const int MSP_SUCCESS=0; /// <summary> ///声明QISRBuildGrammar离线调用的委托 /// </summary> /// <param name="ecode"></param> /// <param name="info"></param> /// <param name="udata"></param> /// <returns></returns> public delegate int GrammarCallBackDelegate(int ecode, string info, ref UserData udata); //声明委托 /// <summary> /// 声明QISRUpdateLexicon离线调用的委托 /// </summary> /// <param name="ecode"></param> /// <param name="info"></param> /// <param name="udata"></param> /// <returns></returns> public delegate int LexiconCallBackDelegate(int ecode, string info, ref UserData udata); //声明委托 [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int MSPLogin(string user, string password, string configs); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int MSPLogout(); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern string QISRSessionBegin(string grammarList, string param, ref int errorCode); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRAudioWrite(string sessionID, IntPtr waveData, uint waveLen, int audioStatus, ref int epStatus, ref int recogStatus); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern string QISRGetResult(string sessionID, ref int rsltStatus, int waitTime, ref int errorCode); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRSessionEnd(string sessionID, string hints); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRGetParam(string sessionID, string paramName, StringBuilder paramValue, ref uint valueLen); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRBuildGrammar(string grammarType, string grammarContent, uint grammarLength, string param, GrammarCallBackDelegate callback, ref UserData userData); [DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)] static extern int QISRUpdateLexicon(string lexiconName, string lexiconContent, uint lexiconLength, string param, LexiconCallBackDelegate callback, ref UserData userData); public static int build_grm_cb(int ecode, string info, ref UserData udata) { return 0; } public static int update_lex_cb(int ecode, string info, ref UserData udata) { return 0; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct UserData { public int build_fini; //标识语法构建是否完成 public int update_fini; //标识更新词典是否完成 public int errcode; //记录语法构建或更新词典回调错误码 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string grammar_id; //保存语法构建返回的语法ID } public static int msplogin() { string login_config = "appid = 58e02a9b"; //登录参数 int ret = 0; ret = MSPLogin("", "", login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数 if (MSP_SUCCESS != ret) { //printf("登录失败:%d\n", ret); //goto exit; } return ret; } public static int build_gm() { // GrammarCallBackDelegate myDelegate = new GrammarCallBackDelegate(CallbackFunc); UserData bgdata = getUserData(); string grm_content = File.ReadAllText(@"call.bnf"); uint grm_cnt_len = (uint)System.Text.Encoding.Default.GetBytes(grm_content).Length; string grm_build_params = "engine_type = local, asr_res_path = fo|res/asr/common.jet, sample_rate = 16000,grm_build_path = res/asr/GrmBuilld, "; int ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, myDelegate, ref bgdata); return ret; } public static int CallbackFunc(int ecode, string info, ref UserData ud) { Console.WriteLine("参数1: {0}", ecode); Console.WriteLine("参数2:{0}", info); return 0; } static public UserData getUserData() { return new UserData { build_fini = 0, update_fini = 0, errcode = -1, grammar_id = "" }; } } }
qq_39595118 2017-07-25
  • 打赏
  • 举报
回复
能麻烦你帮忙翻译一下这个函数吗?其余的我自己来,无论如何,谢谢你
xian_wwq 2017-07-25
  • 打赏
  • 举报
回复
1.注意结构体的字节对齐方式 如果c是1字节对齐,那么c#的结构体Pack= 1 2.注意c dll是多字节的还是Unicode的,c#默认是Unicode的 需要 CharSet = CharSet.Ansi 3.c结构体中的char[]数组对应到c#如果是输入参数可以是string, 但是需要给定长度 比如结构体中的grarmmar_id,要对应成 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_GRAMMARID_LEN)] public string grammarId; 4.函数调用约定需要确认下,是不是CallingConvention.Winapi 很多时候用的是Stdcall P/Invoke调用细节很多,需要逐一确认

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧