首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GlobalMemoryStatus函数在运行NUnit控制台时报告无效的可用页文件

GlobalMemoryStatus函数在运行NUnit控制台时报告无效的可用页文件
EN

Stack Overflow用户
提问于 2015-04-02 12:18:09
回答 2查看 535关注 0票数 4

我是PInvoking GlobalMemoryStatus在NUnit测试中:

代码语言:javascript
复制
[TestFixture]
public class UnitTest1
{
    [DllImport("kernel32.dll")]
    private static extern void GlobalMemoryStatus([In, Out] MemoryStatus status);

    [Test]
    public void TestMethod1()
    {
        var mem = new MemoryStatus();
        GlobalMemoryStatus(mem);
        Assert.AreNotEqual(0, mem.dwAvailPageFile);
    }

    [StructLayout(LayoutKind.Sequential)]
    internal class MemoryStatus
    {
        public uint dwLength;
        public uint dwMemoryLoad;
        public uint dwTotalPhys;
        public uint dwAvailPhys;
        public uint dwTotalPageFile;
        public uint dwAvailPageFile;
        public uint dwTotalVirtual;
        public uint dwAvailVirtual;
    }
}

在中运行时,此测试工作正常。

但是如果用nunit-console.exe执行,它就会失败。

代码语言:javascript
复制
nunit\nunit-console.exe bin\Debug\UnitTestProject1.dll /framework:net-4.5

有了这个输出:

代码语言:javascript
复制
PS C:\UnitTestProject1> nunit\nunit-console.exe bin\Debug\UnitTestProject1.dll /framework:net-4.5
NUnit-Console version 2.6.4.14350
Copyright (C) 2002-2012 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.

Runtime Environment -
   OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
  CLR Version: 2.0.50727.5466 ( Net 3.5 )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: net-4.5
.F
Tests run: 1, Errors: 0, Failures: 1, Inconclusive: 0, Time: 0.1470761 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

Errors and Failures:
1) Test Failure : UnitTestProject1.UnitTest1.TestMethod1
     Expected: not 0
  But was:  0

如果我使用MSTest,它可以很好地工作:

代码语言:javascript
复制
mstest /testcontainer:bin/debug/unittestproject1.dll

有了这个输出:

代码语言:javascript
复制
C:\UnitTestProject1>mstest /testcontainer:bin/debug/unittestproject1.dll
Microsoft (R) Test Execution Command Line Tool Version 11.0.61030.0
Copyright (c) Microsoft Corporation. All rights reserved.

Loading bin/debug/unittestproject1.dll...
Starting execution...

Results               Top Level Tests
-------               ---------------
Passed                UnitTestProject1.UnitTest1.TestMethod1
1/1 test(s) Passed

Summary
-------
Test Run Completed.
  Passed  1
  ---------
  Total   1
Results file:  C:\UnitTestProject1\TestResults\ddimitrov_BPCANALYTICS01 2015-04-02 14_09_16.trx
Test Settings: Default Test Settings

我正在Windows 2008 R2标准x64计算机上运行这个测试,它有6GB的内存。相同的nunit-console测试在Windows8.1上运行良好。

您是否知道我可能做错了什么,以便Win32函数报告不正确的数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-02 14:49:44

结构为已定义,如下所示:

代码语言:javascript
复制
typedef struct _MEMORYSTATUS {
  DWORD  dwLength;
  DWORD  dwMemoryLoad;
  SIZE_T dwTotalPhys;
  SIZE_T dwAvailPhys;
  SIZE_T dwTotalPageFile;
  SIZE_T dwAvailPageFile;
  SIZE_T dwTotalVirtual;
  SIZE_T dwAvailVirtual;
} MEMORYSTATUS;

SIZE_T成员是指针大小的,这意味着您的声明在64位进程中是不正确的。对这些成员使用UIntPtr

票数 2
EN

Stack Overflow用户

发布于 2015-04-02 12:37:31

以下是MSDN的评论

在内存超过4GB的计算机上,MEMORYSTATUS结构可以返回不正确的信息,报告值为-1以表示溢出。如果您的应用程序存在此行为的风险,请使用GlobalMemoryStatusEx函数而不是GlobalMemoryStatus函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29412790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档