相关疑难解决方法(0)

我可以在Visual Studio中设置LARGEADDRESSAWARE吗?

我有一个.net程序集需要32位,需要/ LARGEADDRESSAWARE.

我知道如何使用EditBin执行此操作,但我想知道Visual Studio 2010中是否存在内置方式?或者,有人为此编写了MSBuild任务吗?

编辑:这是一个C#应用程序,所以没有链接器选项可悲:(

.net c# msbuild visual-studio

63
推荐指数
4
解决办法
3万
查看次数

Visual Studio 2017中的vsvars32.bat

作为Visual Studio安装程序是新从Visual Studio 2017年的版本,我不能位于Visual C++的组成部分,说明这里.

我如何进入vsvars32.batVS2017?

visual-studio-2017

36
推荐指数
4
解决办法
3万
查看次数

IntPtr和UIntPtr之间的区别

RegOpenKeyEx当我在页面上注意到这条评论时,我正在查看P/Invoke声明:

更改IntPtrUIntPtr:使用IntPtr句柄调用时,您将遇到溢出.UIntPtr如果您希望在32位和64位平台上正常工作,则是正确的选择.

这并没有太大的意义对我说:都IntPtrUIntPtr应该代表指针因此其大小应与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指出上面的编辑是错误的.

.net c# pointers intptr

11
推荐指数
1
解决办法
6085
查看次数

什么是C#中的数组大小?

我想创建两个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的数组,则不会抛出任何异常.

为什么?

c# arrays

1
推荐指数
1
解决办法
87
查看次数