平台调用错误尝试读取或写入受保护的内存

时间:2016-04-11 18:08:40

标签: c# asp.net .net pinvoke

当我尝试使用平台调用示例时,我正在尝试更改字符串的大小写。

这是我到目前为止所得到的:

class Program
{
    [DllImport("User32.dll", EntryPoint = "CharLowerBuffA",
     ExactSpelling = false,
     CharSet = CharSet.Unicode,
     SetLastError = true
      )]
    public static extern string CharLower(string lpsz);

    [DllImport("User32.dll",
     EntryPoint = "CharUpperBuffA",
     ExactSpelling = false,
     CharSet = CharSet.Unicode,
     SetLastError = true
      )]
    public static extern string CharUpper(string lpsz);     

    static void Main(string[] args)
    {
        string l = "teSarf";

        string ChangeToLower = CharLower(l.ToLower());
        string ChangeToUpper = CharUpper(l.ToUpper());
        Console.WriteLine("{0}", ChangeToLower);
        Console.ReadLine();   
    }
}

我不确定我在哪里出错,但我认为这与 EntryPoint 有关。

我必须使用 Unicode CharLowerBuffW 也无法使用。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

Microsoft's documentation表示CharLowerBuffA是该方法的ANSI变体,但您指定的是Unicode。

尝试使用ANSI - 指定CharSet = CharSet.Ansi - 或者如果您需要Unicode,请使用CharLowerBuffWCharUpperBuffW

同样,该方法有两个参数。你没有第二个。所以试试这个:

[DllImport("User32.dll", EntryPoint = "CharLowerBuffW",
 ExactSpelling = false,
 CharSet = CharSet.Unicode,
 SetLastError = true
  )]
public static extern string CharLower(string lpsz, int cchLength);

[DllImport("User32.dll",
 EntryPoint = "CharUpperBuffW",
 ExactSpelling = false,
 CharSet = CharSet.Unicode,
 SetLastError = true
  )]
public static extern string CharUpper(string lpsz, int cchLength);

并称之为:

string ChangeToLower = CharLower(l, l.Length);

如果仍然无效,请尝试使用字符数组,如NatarajC所述。

答案 1 :(得分:1)

相同的结果意味着,它仍然给出相同的错误,在调用方法时尝试使用string.ToCharArray(),将签名更改为char数组。