惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
MyScale Blog
MyScale Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
罗磊的独立博客
G
Google Developers Blog
Y
Y Combinator Blog
博客园 - 【当耐特】
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
美团技术团队
宝玉的分享
宝玉的分享
Jina AI
Jina AI
小众软件
小众软件
T
Tailwind CSS Blog
A
About on SuperTechFans

博客园 - 同洲共际海让路

国内首本全面深入介绍.NET互操作技术(P/Invoke『或PInvoke,平台调用』,C++ Interop『C++/CLI』,COM Interop)的参考书籍 博客园开发者征途系列图书——《你必须知道的.NET》 一站式查询八字、五行、星座、五格——美名腾人名解析 一句话让别人立马记住你的名字——美名腾智能人名解析 何谓智能起名? 美名腾智能起名系统有了新界面 千名万名,到美名腾来试金。【写在美名腾起名系统Beta版成功发布】 [原]动态平台调用 part 3 (Final) [原]动态平台调用 part 2 [原]动态平台调用 part 1 JavaScript Debugging and Intellisense, JavaScript obfuscator etc from VS 2005 to VS 2008 (VS2005到2008的变迁,JavaScript调试,智能感知/智能感应功能,JavaScript的混淆、压缩等功能的海变桑田) 终于见到了传说中的Scott Guthrie 如何为Team Foundation Server的Daily Build添加自定义操作 客户端安装Team Explorer 2005后,使用时出现package load failure错误的修正 WCF Part 7 : Bindings WCF Part 6 : Address 推荐一个好玩的好东西,ILMerge,微软出的,合并多个.NET组件成一个 WCF Part 5 : Consuming the service [译]WCF Part 4 : Make your service visible through metadata
[原]Bug Report,已提交给微软。平台调用调试时,无法对非托...
同洲共际海让路 · 2008-07-30 · via 博客园 - 同洲共际海让路

详细描述:

首先对非托管函数进行声明:

[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

需要源代码自己进行尝试的朋友请下载:

源代码