long GetImage(long DeviceNumber, string ImgBuf);
string GetErrMsg(long ErrorNo, string ErrInfo);沒試

解决方案 »

  1.   

    你要现在开发环境中打开UNSAFE的选项,这样才能使用指针,否则C#默认是不使用指针和引用的!
      

  2.   

    unsafe设好了
    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
    unsafe public struct IMGBUF
    {
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
     public byte[] ImgBuf;
    }
    声明为:
    [DllImport("c:\\test\\Sino.dll")]
    public static extern int GetImage(int N, [MarshalAs (UnmanagedType.LPStruct)] IMGBUF ImgBuf);
    调用时这样用:
    IMGBUF imageBuf;
    imageBuf.ImgBuf = new byte[256]; //256> 你要的字段
    int i = WebForm1.GetImage(0,imageBuf);
    运行后总提示:
    无法封送 parameter #2:无效的托管/非托管类型组合(该值类型必须与 Struct 成对出现)。 
    这是怎么回事啊?
      

  3.   

    unsigned char *->StringBuilder
    char *->StringBuilderlong GetImage(long DeviceNumber, StringBuilder ImgBuf);
    StringBuilder GetErrMsg(long ErrorNo, StringBuilder ErrInfo);
      

  4.   

    在c语言里,char类型是8位的,而c#里是16位的,所以无论是用String还是char[]或是StringBuffer,都不是它的原数据类型。实际上c语言的char就相当于c#的byte,unsigned char * --> byte[]。图片都是以字节流传输的,所以第一个方法调用的话,你可以用byte[]试试。
      

  5.   

    csdn_bob(文子) 兄的办法我试了,不行啊!!!
      

  6.   

    to xixigongzhu(夕夕公主):
    按照你的说法我将函数在.NET里声明为:
    [DllImport("c:\\test\\Img.dll")]
    public static extern byte[] GetErrMsg(int N,byte[] ErrInfo);
    实际调用中:
    int i=-1080;
    byte[] errmsg = new Byte[2048];
    GetErrorMsg(i,errmsg);
    运行后提示:无法封送 return value
    不知道该怎么修改?
    我已经给你发了邮件,请你查收,谢谢!
      

  7.   

    我现在将其改为
    public static extern byte[] GetErrMsg(int N,out byte[] ErrInfo);
    运行后会有同样的提示!!!
      

  8.   

    unsigned char *,char *在非托管环境中没有本区别!
    我自己写了一个程序度了,没问题呀!!
    mydll.def
    ------------------------------------------------------------
    LIBRARY MyDllEXPORTS
    f @1mydll.cpp
    -------------------------------------------------------------char * f(int  a,  char*  b,  int*  c,unsigned char * s) 
    {
    if(strcmp(b,"123")==0)
    {
    return(b);
    }
    else
    {
    return("2345");
    }
    }test.cs
    ----------------------------------------------------
    [DllImport("mydll.dll")]
    public static extern StringBuilder f(int a,StringBuilder b,ref int c,StringBuilder d);public static void Main()
    {
    StringBuilder b=new StringBuilder("25235");

    int c=0;
    Console.WriteLine("{0}",f(10,b,ref c,b));
    Console.ReadLine();}
      

  9.   

    参考:
    ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconplatforminvokedatatypes.htm
      

  10.   

    ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconmarshalingdatawithplatforminvoke.htm
    因为我研究得不多,也没写过这样的例子,所以只能找些说明文档,希望对你有用。
    如果是别的版本,请截取cpguidenf/html/cpconmarshalingdatawithplatforminvoke.htm。