从[2]我们已经定义如下:
托管代码是简单的“码”,提供足够的信息,让.NET公共语言运行时(CLR)提供一套核心服务,包括:
更多细节可以在可见[2]
安全的代码只使用管理的数据-code,也没有无法核实数据类型或不支持的数据类型转换/强制操作(即非歧视工会或结构/接口指针)。C#,Visual Basic .NET中,并使用/ clr编译的Visual C ++代码:安全产生安全的代码。
不安全的代码被允许进行这样的底层操作的声明和对工作的指针,指针和整型之间执行转换,并采取变量的地址-code。这样的操作允许与底层操作系统交互,访问内存映射设备,或实现一个时间关键算法。本机代码是不安全的。
如果.NET应用程序是100%安全的代码,很容易让你迁移.NET应用程序的32位机和64位系统上运行。Visual Studio内部的2015年,你可以编译它通过在项目属性选项卡设置目标值为anycpu。[6]
100%的托管代码是一个大问题。这是很难保持代码100%的托管代码。
在下列情况下,我们计划使用PEVerify.exe来验证它们是否安全的代码。
PEVerify.exe [10]是确定一个工具,编译生成的MSIL代码和相关的元数据类型满足安全要求是否。我们将使用这个工具来测试这里的例子类型安全的烦躁。
测试所有下列情况下,我们使用PEVerify格式为:peverify / MD / IL文件名.exe
不重新发明轮子,我使用斯科特Hanselman的[4]的例子来验证类型安全使用指针类型。
using System;
using System.Runtime.InteropServices;
namespace TestGetSystemInfo
{
public class WinApi
{
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
internal _PROCESSOR_INFO_UNION uProcessorInfo;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
//test int type causes problem on 64-bit OS
//after change to IntPtr everything is good
public int lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort dwProcessorLevel;
public ushort dwProcessorRevision;
}
[StructLayout(LayoutKind.Explicit)]
public struct _PROCESSOR_INFO_UNION
{
[FieldOffset(0)]
internal uint dwOemId;
[FieldOffset(0)]
internal ushort wProcessorArchitecture;
[FieldOffset(2)]
internal ushort wReserved;
}
}
public class Program
{
public static void Main(string[] args)
{
WinApi.SYSTEM_INFO sysinfo = new WinApi.SYSTEM_INFO();
WinApi.GetSystemInfo(ref sysinfo);
Console.WriteLine("dwProcessorType ={0}", sysinfo.dwProcessorType.ToString());
Console.WriteLine("dwPageSize ={0}", sysinfo.dwPageSize.ToString());
Console.WriteLine("lpMaximumApplicationAddress ={0}", sysinfo.lpMaximumApplicationAddress.ToString());
}
}
}
测试结果如下:
当语句是公众诠释lpMaximumApplicationAddress; ,编译它瞄准64位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当在64位上运行,对lpMaximumApplicationAddress的价值得到的问题。
当语句是公众的IntPtr lpMaximumApplicationAddress; ,编译它瞄准32位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着输入safe.When在32位上运行,效果很好。
当语句是公众的IntPtr lpMaximumApplicationAddress; ,编译它瞄准64位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当在64位上运行,效果很好。
当语句是公众的IntPtr lpMaximumApplicationAddress; ,编译它的目标值为anycpu。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当两个32位和64位操作系统上运行它,一切运作良好。
从[7]我们知道的IntPtr是一个特定于平台的类型来表示一个指针或句柄。
一个更明确的说法是[6]:IntPtr的是“本机(特定于平台)大小的整数。” 它的内部表示为void *,但公开为整数。每当你需要存储一个非托管指针,并且不希望使用不安全的代码,你可以使用它。IntPtr.Zero实际上是NULL(空指针)。
虽然所有这些sceanarios的,PEVerify.exe结果表明他们是类型安全组件,但我们仍然看到问题,运行这些可执行文件时。因此,迁移从32位到64位我们的.NET应用程序,我们需要回顾源代码来解决这些整数指针。我们不能完全依赖于PEVerify.exe。
热门源码