邀请大峡一起来找茬,调用vc的dll,出现未将对象引用设置到对象的实例错误....
[错误内容]
未处理的“System.NullReferenceException”类型的异常出现在 cmppAPI_test.exe 中。
其他信息: 未将对象引用设置到对象的实例
[部分代码]
[函数定义]
public class API_SubmitSMS
{
[DllImport( "LongSms.dll ",EntryPoint= "Cmpp_submitSMS ",SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConvention=CallingConvention.Cdecl)]
public static extern int Cmpp_submitSMS
(
StringBuilder SMId,//1
StringBuilder Registered_Delivery ,//2
StringBuilder Msg_level ,//3
byte[] Service_Id ,//4
StringBuilder Fee_UserType ,//5
byte[] Fee_terminal_Id ,//6
StringBuilder Fee_terminal_type,//7
StringBuilder TP_udhi,//8
StringBuilder Msg_Fmt ,//9
byte[] Msg_src ,//10
byte[] FeeType ,//11
byte[] FeeCode ,//12
byte[] ValId_Time ,//13
byte[] At_Time ,//14
byte[] Src_Id ,//15
StringBuilder DestUsr_tl ,//16
byte[] Dest_terminal_Id ,//17
StringBuilder Dest_terminal_type,//18
StringBuilder Msg_Length ,//19
byte[] Msg_Content ,//20
StringBuilder LinkID,//21
StringBuilder Msg_Id,//22
ulong Result//23
);
}
[调用]
//1
string s_SMID = " ";
//byte[] s1 = System.Text.Encoding.Unicode.GetBytes(s_SMID);
System.Text.StringBuilder s1 = new System.Text.StringBuilder(s_SMID);
//4 是否要求返回状态确认报告:0:不需要;1:需要;2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)
string s_Registered_Delivery = " ";
//byte[] s2 = System.Text.Encoding.Unicode.GetBytes(s_Registered_Delivery);
System.Text.StringBuilder s2 = new System.Text.StringBuilder(s_Registered_Delivery);
//5 信息优先级别
string s_Msg_level = " ";
//byte[] s3 = System.Text.Encoding.Unicode.GetBytes(s_Msg_level);
System.Text.StringBuilder s3 = new System.Text.StringBuilder(s_Msg_level);
//6 业务类型,是数字、字母和符号的组合。
string s_Service_Id = " ";
byte[] s4 = System.Text.Encoding.Unicode.GetBytes(s_Service_Id);
//7 计费用户类型字段,0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
string s_Fee_UserType = " ";
//byte[] s5 = System.Text.Encoding.Unicode.GetBytes(s_Fee_UserType);
System.Text.StringBuilder s5 = new System.Text.StringBuilder(s_Fee_UserType);
//8 被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
string s_Fee_terminal_Id = " ";
byte[] s6 = System.Text.Encoding.Unicode.GetBytes(s_Fee_terminal_Id);
//9 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
string s_Fee_terminal_type = " ";
//byte[] s7 = System.Text.Encoding.Unicode.GetBytes(s_Fee_terminal_type);
System.Text.StringBuilder s7 = new System.Text.StringBuilder(s_Fee_terminal_type);
//10 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
//发送超长短信应将该值置为1
string s_TP_udhi = " ";
//byte[] s8 = System.Text.Encoding.Unicode.GetBytes(s_TP_udhi);
System.Text.StringBuilder s8 = new System.Text.StringBuilder(s_TP_udhi);
//11 信息格式,0:ASCII串; 3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字 。。。。。。
string s_Msg_Fmt = " ";
//byte[] s9 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Fmt);
System.Text.StringBuilder s9 = new System.Text.StringBuilder(s_Msg_Fmt);
//12 信息内容来源(SP_Id),sp的企业代码
string s_Msg_src = " ";
byte[] s10 = System.Text.Encoding.Unicode.GetBytes(s_Msg_src);
//13 资费类别,01:对“计费用户号码”免费;02:对“计费用户号码”按条计信息费;
//03:对“计费用户号码”按包月收取信息费;04:对“计费用户号码”的信息费封顶;
//05:对“计费用户号码”的收费是由SP实现
string s_FeeType = " ";
byte[] s11 = System.Text.Encoding.Unicode.GetBytes(s_FeeType);
//14 资费代码(以分为单位),如:“0050”代表人民币0.50元
string s_FeeCode = " ";
byte[] s12 = System.Text.Encoding.Unicode.GetBytes(s_FeeCode);
//15 存活有效期,格式遵循SMPP3.3协议
string s_ValId_Time = " ";
byte[] s13 = System.Text.Encoding.Unicode.GetBytes(s_ValId_Time);
//16 定时发送时间,格式遵循SMPP3.3协议。这个字段可以让短信在规定的时间内发送给手机用户。
//一般情况下不添,保留为空字符串
string s_At_Time = " ";
byte[] s14 = System.Text.Encoding.Unicode.GetBytes(s_At_Time);
//17 源号码,SP的服务代码或前缀为服务代码的长号码,
//网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
//该号码最终在用户手机上显示为短消息的主叫号码
string s_Src_Id = " ";
byte[] s15 = System.Text.Encoding.Unicode.GetBytes(s_Src_Id);
//18,接收信息的用户数量(小于100个用户)
//通常为1,但长短信这如何添?
string s_DestUsr_tl = " ";
//byte[] s16 = System.Text.Encoding.Unicode.GetBytes(s_DestUsr_tl);
System.Text.StringBuilder s16 = new System.Text.StringBuilder(s_DestUsr_tl);
//19 接收短信的MSISDN号码,一个类似字符串数组的结构。受DestUsr_tl的约束,决定了本字段的长度。
//21*DestUsr_tl
string s_Dest_terminal_Id = "13912345678 ";
byte[] s17 = System.Text.Encoding.Unicode.GetBytes(s_Dest_terminal_Id);
//20 只有在cmpp3.0里面使用
string s_Dest_terminal_type = " ";
//byte[] s18 = System.Text.Encoding.Unicode.GetBytes(s_Dest_terminal_type);
System.Text.StringBuilder s18 = new System.Text.StringBuilder(s_Dest_terminal_type);
//21 信息长度(Msg_Fmt值为0时: <160个字节;其它 <=140个字节)
string s_Msg_Length = " ";
//byte[] s19 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Length);
System.Text.StringBuilder s19 = new System.Text.StringBuilder(s_Msg_Length);
//22 信息内容,一般情况下存在汉字传输,所以默认的编码/解码应该为Encoding.Default
string s_Msg_Content = " ";
//byte[] s20 = System.Text.Encoding.GetEncoding(1252).GetBytes(s_Msg_Content);
byte[] s20 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Content);
//23 只有cmpp3.0里面使用
string s_LinkID = " ";
//byte[] s21 = System.Text.Encoding.Unicode.GetBytes(s_LinkID);
System.Text.StringBuilder s21 = new System.Text.StringBuilder(s_LinkID);
//24 输出参数,返回网关返回的ID
string s_Msg_Id = " ";
//byte[] s22 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Id);
System.Text.StringBuilder s22 = new System.Text.StringBuilder(s_Msg_Id);
//25 0:不等待网关回应;1,等待网关回应后返回
ulong Result = 0;
//
int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,Result);
请问为什么会出现
未将对象引用设置到对象的实例错误....?
达人快进来啊,在线等,急啊,求救//求救,,,,,,
[解决办法]
你先不要用int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,ref Result);
先用具体的参数直接代如
int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,3,1,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,ref Result);
问题应该在unsigned char字段内容不匹配上