比较c#中调用C dll的字符串

时间:2012-07-04 17:24:52

标签: c# c string dll marshalling

(学习c#的第2天)我正在从C#传递缓冲区到C dll。 C函数将字符串“text”复制到缓冲区中。回到C#代码中,我将“text”与缓冲区中的内容进行比较,并且它没有比较相等。我错过了什么?

    extern "C" __declspec( dllexport )      
    int  cFunction(char *plotInfo, int bufferSize) 
    {
        strcpy(plotInfo, "text");
        return(0);
    }

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("mcDll.dll", CallingConvention = CallingConvention.Cdecl,
                                                      CharSet=CharSet.Ansi)]
        public static extern int cFunction(StringBuilder theString, int bufSize);

        static void Main(string[] args)
        {
            StringBuilder s = new StringBuilder(55);
            int result = cFunction(s, 55);
            Console.WriteLine(s);

            string zz = "text";
            if (s.Equals(zz))
                Console.WriteLine( "strings compare equal");
            else
                Console.WriteLine("not equal");

            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

sStringBuilder,而zzstring

尝试比较

s.ToString().Equals(zz);

通常,Equals()执行引用类型的引用比较。某些类(如String)覆盖Equals()以允许包含相同字符的字符串被视为相等(尽管出于性能目的,我相信实际实现首先检查引用相等性,然后比较每个字符串的内容)。

您当前的代码正在调用StringBuilder的.Equals()方法。

答案 1 :(得分:1)

StringBuilderstring没有比较内容比较任何StringBuilderstring总是会返回false

StringBuilder类有两个Equals重载:

  1. Equals(object),它继承自object并执行参考比较。
  2. Equals(StringBuilder)根据其中包含的字符串比较两个StringBuilders
  3. 您正在调用重载1,因此不会比较内容。

    .ToString()上调用s以获取其中包含的字符串,然后在其上调用Equals以进行字符串比较。