这是C写的QQ TEA 算法,我先是尝试用C#改写,被C的指针搞胡了,
后来把他封装成 Win32 DLL,尝试在 C#中引用.源码在以下网址:
http://www.linuxboy.net/msnqq/017.htmlC的函数原型:
void encrypt_msg(unsigned char *in, int inlen, unsigned long *key, unsigned char *out, unsigned long *outlen)我的引用方法:
[DllImport("QQTea.dll", EntryPoint = "encrypt_msg", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void encrypt_msg(byte[] inData, int inLen,byte[] key,out byte[] outData,out int outLen); 调用时发生以下异常:检测到 FatalExecutionEngineError
Message: 运行库遇到了错误。此错误的地址为 0x79e7c5eb,在线程 0x4c0 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。救命呀!该如何调用??或请高手帮我改成C#版,多谢!!!!

解决方案 »

  1.   

    没有引用过c的,引用的Fortran的, [DllImport("Dll1.dll",SetLastError=true,
    CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Winapi)]
    public static extern void FFD(ref double F,ref int N1,ref int N2,ref double P); [DllImport("Dll1.dll",SetLastError=true,
    CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Winapi)]
    public static extern void FXD(ref double P,ref int N1,ref int N2,ref double EPS,ref double F,ref int IER);
    当时在intel的.net版本Fortran因没有把一个选项设置为输出.后来更正后又ok,不知会对你有帮助..
      

  2.   

    看你的c函数传入的是指针,那在c#里要用unsafe操作.没有试,只是我这样想的
      

  3.   

    使用MarshalAs属性,发送非托管封包:public static extern void encrypt_msg([MarshalAs(UnmanagedType.LPArray)] byte[] inData, int inLen,[MarshalAs(UnmanagedType.LPArray)] byte[] key,out [MarshalAs(UnmanagedType.LPArray)] byte[] outData,out int outLen);
      

  4.   

    public static extern void encrypt_msg(byte[] inData, int inLen,uint[] key, byte[] outData,uint outLen[]);
      

  5.   

    用了 kssys()  的方法 还是不行
    救命呀,老板催死了
      

  6.   

    have a try!
    public static extern void encrypt_msg([In,MarshalAs(UnmanagedType.LPArray)] byte[] inData, int inLen,[In,MarshalAs(UnmanagedType.LPArray)] byte[] key,out [Out,MarshalAs(UnmanagedType.LPArray)] byte[] outData,ref int outLen);
      

  7.   

    Sorry!
    public static extern void encrypt_msg([In,MarshalAs(UnmanagedType.LPArray)] byte[] inData, int inLen,[In,MarshalAs(UnmanagedType.LPArray)] byte[] key, [Out,MarshalAs(UnmanagedType.LPArray)] byte[] outData,ref int outLen);
      

  8.   

    高人呀,我愿为你两肋插刀呀!!!Knight94(愚翁) 正解!!!
    多谢