C++原函数为int WINAPI DnaSelectPoint(char *pszPoint[], unsigned short nPoint);
VB声明为:Public Declare Function DnaSelectPoint Lib "ezdnaapi.dll" (ByVal Point As String, ByVal LenPoint As Integer) As Integer
C#定义为 :
        [DllImport("ezdnaapi.dll", CallingConvention = CallingConvention.Winapi)]
        public static extern int DnaSelectPoint(string  Point, int LenPoint);
VB代码为: 
    Dim ret As Integer
    'CRUCIAL!!! Must use fixed length strings
    Dim strPointName As String * 40
    ret = DnaSelectPoint(strPointName, Len(strPointName))
C#代码为:
         int ret;
         string strPointName = new string('\0', 40);
         ret = DnaSelectPoint(strPointName, strPointName.Length);
VB调用之后会修改 strPointName的值,但C#不会,请问该如何修改,不用不安全代码  

解决方案 »

  1.   

    [DllImport("ezdnaapi.dll", CallingConvention = CallingConvention.Winapi)]
            public static extern int DnaSelectPoint(out string Point, int LenPoint);
      

  2.   

    public static extern int DnaSelectPoint(out string Point, int LenPoint);
      public static extern int DnaSelectPoint(ref string Point, int LenPoint);
      这样都不好使啊!
      

  3.   

    报这些错误啊:运行库遇到了错误。此错误的地址为 0x79e95b95,在线程 0xd94 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
      

  4.   

    [DllImport("ezdnaapi.dll", CallingConvention = CallingConvention.Winapi)]
    public static extern int DnaSelectPoint(out string Point, ushort LenPoint);
      

  5.   

    楼主啊,参数前加out也不好使啊
      

  6.   

    把 string改为stringbuildstring在C#中是不能修改的
    stringbuild可以修改
      

  7.   

    [DllImport("ezdnaapi.dll", CallingConvention = CallingConvention.Winapi)]
    public static extern int DnaSelectPoint( System.IntPtr Point, int LenPoint);
    call
    IntPtr p = Mashal.AllocToGlobalMem( 40 );
    DnaSelectPoint( p , 40 );
      

  8.   

    [DllImport("ezdnaapi.dll", CallingConvention = CallingConvention.Winapi)]
            public static extern int DnaSelectPoint(StringBuilder Point, Int32 LenPoint);