我有一个.net程序集需要32位,需要/ LARGEADDRESSAWARE.
我知道如何使用EditBin执行此操作,但我想知道Visual Studio 2010中是否存在内置方式?或者,有人为此编写了MSBuild任务吗?
编辑:这是一个C#应用程序,所以没有链接器选项可悲:(
作为Visual Studio安装程序是新从Visual Studio 2017年的版本,我不能位于Visual C++的组成部分,说明这里.
我如何进入vsvars32.batVS2017?
RegOpenKeyEx当我在页面上注意到这条评论时,我正在查看P/Invoke声明:
更改
IntPtr为UIntPtr:使用IntPtr句柄调用时,您将遇到溢出.UIntPtr如果您希望在32位和64位平台上正常工作,则是正确的选择.
这并没有太大的意义对我说:都IntPtr和UIntPtr应该代表指针因此其大小应与OS的位数-无论是32位或64位.由于这些不是数字而是指针,因此它们的带符号数值应该无关紧要,只有表示它们指向的地址的位.我想不出为什么这两者之间会有什么不同,但是这个评论让我不确定.
是否有使用的具体原因UIntPtr而不是IntPtr?根据文件:
该
IntPtr类型是符合CLS,而UIntPtr类型不是.IntPtr在公共语言运行库中仅使用该类型.UIntPtr提供的类型主要是为了保持与IntPtr类型的架构对称性.
当然,这意味着没有区别(只要有人不尝试将值转换为整数).所以pinvoke.net的上述评论是错误的吗?
编辑:
在阅读了MarkH的回答之后,我做了一些检查,发现.NET应用程序不是大地址识别,并且在32位模式下编译时只能处理2GB的虚拟地址空间.(可以使用hack打开大地址识别标志,但MarkH的答案显示.NET Framework内的检查会破坏因为地址空间仅为2GB,而不是3GB.)
这意味着指针可以拥有的所有正确的虚拟内存地址(就.NET Framework而言)将介于0x00000000和0x7FFFFFFF之间.当此范围转换为有符号时int,没有值为负值,因为未设置最高位.这强化了我的信念,即使用IntPtr与UIntPtr没有区别.我的推理是否正确?
Fermat2357指出上面的编辑是错误的.
我想创建两个200M int元素数组.像那样:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Arr
{
class Program
{
static void Main(string[] args)
{
int Min = 0;
int Max = 10;
int ArrSize = 200000000;
int[] test2 = new int[ArrSize];
int[] test3 = new int[ArrSize];
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在VS2013下,我出现了内存异常,黄色箭头指向上int[] test3 = new int[ArrSize];线.这台机器有12GB的RAM.
如果我将元素数量减少到150M,则不会抛出任何异常.
如果我只初始化一个大小为200M的数组,则不会抛出任何异常.
为什么?