C# 中安全代码与不安全代码

C# 中安全代码与不安全代码 P/Invoke

非托管代码需要在unsafe块中书写。

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

namespace IntPtrSample
{
    class Program
    {
        static void Main(string[] args)
        {
            string stringA = "I seem to be turned around!";
            int copylen = stringA.Length;

            // Allocate HGlobal memory for source and destination strings
            IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
            IntPtr dptr = Marshal.AllocHGlobal(copylen + 1);

            // The unsafe section where byte pointers are used.
            unsafe
            {
                byte* src = (byte*)sptr.ToPointer();
                byte* dst = (byte*)dptr.ToPointer();

                src[0] = (byte)‘a‘;
                src[1] = (byte)‘a‘;
                src[2] = (byte)‘a‘;
                src[3] = (byte)‘a‘;

                if (copylen > 0)
                {
                    // set the source pointer to the end of the string
                    // to do a reverse copy.
                    src += copylen - 1;

                    while (copylen-- > 0)
                    {
                        *dst++ = *src--;
                    }
                    *dst = 0;
                }
            }

            string stringB = Marshal.PtrToStringAnsi(dptr);

            Console.WriteLine("Original:\n{0}\n", stringA);
            Console.WriteLine("Reversed:\n{0}", stringB);

            // Free HGlobal memory
            Marshal.FreeHGlobal(dptr);
            Marshal.FreeHGlobal(sptr);

        }
    }
}

// 参考文章

http://msdn.microsoft.com/en-us/library/system.intptr.topointer.aspx

http://msdn.microsoft.com/en-us/library/etb4xxec.aspx

时间: 2024-11-05 18:37:39

C# 中安全代码与不安全代码的相关文章

编程算法 - 数组中出现次数超过一半的数字 代码(C)

数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. 1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求. 2. 使用计数方法依次比較. 代码:  方法1: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */

Java中普通代码块,构造代码块,静态代码块区别及代码示例

//普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--"先出现先执行"public class CodeBlock01{ public static void main(String[] args){ { int x=3; System.out.println("1,普通代码块内的变量x="+x); } int x=1; System.out.println("主方法内的变量x="

JQuery中trim函数的具体实现代码

由于Javascript 1.8.1 之前的版本,没有内置 trim 函数,所以 JQuery 对它有自己的实现.不同的JQuery版本,trim函数的实现也不尽相同. 阅读本文需要掌握正则表达式用法,如果不是很了解,建议阅读这个.鉴于正则表达式的强大用途(在各种语言如JS,Python,Ruby,Java中都会用到),建议重点学习并掌握. JQuery 1.7.2版本 // 截取的部分源码,不是完整语句,旨在说明实现过程 trimLeft = /^\s+/, trimRight = /\s+$

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

.Net Web产品中增加自己的功能和代码?

背景: 最近有一个项目,一个朋友找了一个网上比较成熟的CMS系统(动易),让我给他增加一些功能,这个产品功能挺多,但是没有源代码.按照以前的做法,就是直接反编译他的dll,生成源代码,然后在源代码的基础上修改和完善自己的功能.但是研究了一下这个产品,bin下面的DLL非常多,有主要的,还有辅助的.如果每个dll都反编译,简直不现实. ? 用发编译工具?ILSpy打开里面几个主要的dll,发现还加壳混淆了,用De4Dot反混淆出来.里面的代码还是非常清晰,但是如果每个dll都这样搞,岂不累死. ?

ava中普通代码块,构造代码块,静态代码块区别及示例

//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 //普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行” 1 2 public class CodeBlock01{ 3 public static void main(String[] args){ 4 5 { 6 int x=3; 7 Syst

当C#中带有return的TryCatch代码遇到Finally时代码执行顺序

编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理.这一点比较常见. 现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序.众所周知,return的作用是退出当前函数,不执行return后面的代码.那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则

Switch Case语句中多个值匹配同一个代码块的写法

switch ($p) { case 'home': case '': $current_home = 'current'; break; case 'users.online': case 'users.location': case 'users.featured': case 'users.new': case 'users.browse': case 'users.search': case 'users.staff': $current_users = 'current'; break

ant中提取properties和xml提高代码复用性

本文接着上文对前面的示例进行优化,在前面的build.xml中,有些代码是重复的,我们可以将其抽象出来拿来共同使用,比如将一些路劲提取出来放入properties,可以达到共用的同时,还可以增强程序的可维护性,以后路劲变了只需改配置文件,不用改动build.xml.properties维护简单,以键值对形式存放:而xml不单可以提取属性,还可以提取target. 比如在上文中可以将src1,src2,src3的路劲提取出来,放入properties,以后要是路劲变了,直接更改properties

浅析Java中的构造代码块、静态代码块与构造方法

构造代码块.静态代码块与构造方法是三种不同的代码块,那么他们到底有什么区别呢? 一.简单认识一下构造代码块.静态代码块与构造方法 class A { //构造代码块 { System.out.println("构造代码块A"); } //静态代码块 static { System.out.println("静态代码块A"); } //构造方法 public A() { System.out.println("构造方法A"); } } 二.弄清三者