详细描述:
首先对非托管函数进行声明:
[DllImport("NativeLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private extern static void TestStringArgumentsFixLength(string inString, StringBuilder outString, int bufferSize);
然后再选中“Enable unmanaged code debugging”
编写如下代码进行测试:
private static void TestStringArgumentsFixLength()
{
string inString = "This is a input string.";
int bufferSize = inString.Length;
StringBuilder sb = new StringBuilder(bufferSize);
TestStringArgumentsFixLength(inString, sb, bufferSize + 1);
Console.WriteLine("Original: {0}", inString);
Console.WriteLine("Copied: {0}", sb.ToString());
}
在红色代码行打断点,按F11可以单步进非托管函数。
但是如果修改成:
private static void TestStringArgumentsFixLength()
{
string inString = "This is a input string.";
int bufferSize = inString.Length;
StringBuilder sb = new StringBuilder(bufferSize);
// 如果上面函数调用的最后一个参数用StringBuilder对象的属性指定。
// 虽然运行结果正确,但调试器
// 将不能单步执行进非托管代码中。这有可能是.NET Framework的小BUG。
TestStringArgumentsFixLength(inString, sb, sb.Capacity + 1);
Console.WriteLine("Original: {0}", inString);
Console.WriteLine("Copied: {0}", sb.ToString());
}
在红色代码行打断点,按F11无论如何,都无法单步进非托管函数。
测试环境:
Windows Server 2008
Windows Vista Enterprise
Windows XP SP2
开发工具:
Microsoft Visual Studio 2005
Version 8.0.50727.42 (RTM.050727-4200)
Microsoft .NET Framework
Version 2.0.50727 SP1
需要源代码自己进行尝试的朋友请下载: