我有一个别人用C++写的DLL,可以调用的函数格式为int Login([in]const char* lpszAccount, [in]const char* lpszPassword, [in][out]TChar* lpszMessage, [in][out]int* lpszMessageBufferSize);我用C#调用这个函数[System.Runtime.InteropServices.DllImport("Login.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern int Login(byte[] account, byte[] password, StringBuilder message, ref int bufferSize);public static int LoginMeIn(string account, string password, out message)
{
    int bufferSize = 1024;
    StringBuilder sb = new StringBuilder(bufferSize);
    int result = Login(
        System.Text.Encoding.Default.GetBytes(account),
        System.Text.Encoding.Default.GetBytes(password),
        sb,
        ref bufferSize);
    message = sb.ToString();
    return result;
    问题一:请问这里用到的byte[]数组以及StringBuilder都需要手动释放吗?
}
问题二:用StringBuilder传给C++的TChar*参数,是否正确的做法?请高手指点一下,谢谢!

解决方案 »

  1.   

    我有一个别人用C++写的DLL,可以调用的函数格式为int Login([in]const char* lpszAccount, [in]const char* lpszPassword, 
        [in][out]TChar* lpszMessage, [in][out]int* lpszMessageBufferSize);我用C#调用这个函数[System.Runtime.InteropServices.DllImport("Login.dll", 
    CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]public static extern int Login(byte[] account, byte[] password, 
        StringBuilder message, ref int bufferSize);public static int LoginMeIn(string account, string password, out message)
    {
        int bufferSize = 1024;
        StringBuilder sb = new StringBuilder(bufferSize);
        int result = Login(
            System.Text.Encoding.Default.GetBytes(account),
            System.Text.Encoding.Default.GetBytes(password),
            sb,
            ref bufferSize);
        message = sb.ToString();
        return result;
    }
    问题一:请问这里用到的byte[]数组以及StringBuilder都需要手动释放吗?
    问题二:用StringBuilder传给C++的TChar*参数,是否正确的做法?请高手指点一下,谢谢!
      

  2.   

    一.不用,因为这个byte[]还是拖管的
    二.msdn中有所有类型的等值转换表,自己可以查
    LPSTR/ char*  可以用System.String 或 System.Text.StringBuilder代替
      

  3.   

    问题一,不用, 如果没有在C#中使用指针,就是安全的代码,不用释放.
    问题二, 但是传给C++可以考虑用, BYTE[]
      

  4.   

    对于TChar*,如果传byte[]会出错,传StringBuilder没事
      

  5.   

    因为是C++,在ANSI或MBCS下 TCHAR 在ANSI下可以转换成const char*,在Unicode下,可以转换成const wchar_t,以为楼主C++函数没指定 CharSet的形式,默认就是Charset=CharSet.Ansi,所以这里的TCHAR就相当于const char*.
    而用StringBuilder最好是当托管代函数使用Unicode时,因为如果非托管函数使用的ANSI编码,而StringBuildr是Unicode编码,会降低性能!
    综上所述:建议制定为CharSet=CharSet.Unicode,并用MarshalAs属性处理!
    仅供参考!
      

  6.   

    我最近也在一个测试工具软件中调用了C++的DLL文件,在C#中申明的变量如:byte[] 不用释放,但是你调用的c++的函数传进去的参数,需要释放,具体怎么释放你可以看DLL文件的导出函数,里面应该会包含释放资源的函数,调用就OK啦!我的就是这样的,我的是调用里面的一个void release();释放的,具体参看DLL文件的导出函数工具可以上google搜下eXeScope这个工具,很好用直接把DLL文件导进去就可以看导出函数了,希望对LZ有点帮助。。
      

  7.   

    噢。不好意思我上面只回答了你的第一个问题,呵呵。没注意看!第二个问题,我用的时候把所有的char * 类型的都用IntPtr类型来代替的,不管是传入的参数还是传出的都用IntPtr,不知道你那行不行。可以试试!