Articles of .net

如何计算任务pipe理器的内存使用情况?

好吧,我正在使用WMI(.net / C#)不断收集有关在机器上运行的特定进程的数据。 我通过Win32_PerfFormattedData_PerfProc_Process类获取数据。 这个类有很多属性,但我们感兴趣的是如下: uint64 PageFileBytes; 值(以字节为单位)该进程在页面文件中使用的值。 分页文件存储进程使用的未包含在其他文件中的内存页面。 分页文件由所有进程共享,分页文件中缺less空间可阻止其他进程分配内存。 uint32 PoolNonpagedBytes; 非分页池中的值,以字节为单位,表示无法写入磁盘的对象的系统内存区域(操作系统使用的物理内存),但只要分配给它们,它们就必须保留在物理内存中。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes与Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes属性的计算方式不同,因此它可能不等于Win32_PerfFormattedData_PerfProc_Process的所有实例的PoolPagedBytes总数。 该属性仅显示最后一个观察值; 这不是一个平均值。 uint32 PoolPagedBytes; 在页面缓冲池中的值,以字节为单位,表示在不使用时可以写入磁盘的对象的系统内存区域(操作系统使用的物理内存)。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes属性的计算方式与Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes属性不同,因此它可能不等于Win32_PerfFormattedData_PerfProc_Process的所有实例的PoolPagedBytes总数。 该属性仅显示最后一个观察值; 这不是一个平均值。 uint64 PrivateBytes; 以字节为单位的当前值,该进程已经分配了不能与其他进程共享的值。 uint64 VirtualBytes; 当前进程正在使用的虚拟地址空间的大小(以字节为单位)。 使用虚拟地址空间不一定意味着相应地使用磁盘或主内存页面。 虚拟空间是有限的,通过使用太多,该过程可能会限制其加载库的能力。 uint64 WorkingSet; 在这个过程的任何时间点的最大数量,以字节为单位。 工作集是进程中线程最近触及的一组内存页面。 如果计算机中的可用内存超过阈值,则即使不在使用中,页面也会留在进程的工作集中。 当可用内存低于阈值时,页面将从工作集中删除。 如果需要的话,在他们离开主存之前,它们被软件故障重新放回工作集。 我目前使用WorkingSet字段来报告进程的内存使用情况。 但是,这与任务pipe理器显示的内容不一致。 我尝试过使用PrivateBytes但这也不是“正确的”。 应用程序监视的进程是一个.NET进程(如果这很重要),应用程序会报告它使用至less比任务pipe理器同时显示多100MB的内存。 所以问题是什么是“公式”来计算过程的内存使用情况的最佳近似,如任务pipe理器所示?

使内存密集的后台应用程序“友好”

我有一个应用程序,需要定期处理大块的数据与一个计算平凡的algorithm。 事实certificate,我也可以通过将数据块保存在内存caching中来防止系统从硬盘访问中放慢速度。 该应用程序是一个低优先级的应用程序,所以我正在尽量减less它对整个系统的影响,这意味着使用额外的内存(可用时)来减lessCPU和硬盘驱动器的负载。 高速caching的数据只有64MB字节块,我在内存中的数据越多,程序在驱动器上的开销就越小。 我需要做的就是转储内存caching,只要系统上的其他应用程序需要比可用内存更多的物理内存,并且这样做的速度足够快,以至于用户从不觉得系统由于高内存需求而变慢。 我特别感兴趣的是如何在.NET应用程序中完成这项工作。

在桌面下打开和closuresWindows 8触摸键盘tabtip

我需要从Windows 8(桌面winform.net)下的程序closurestabtip键盘。 我发现在需要的时候打开它,运行TabTip.exe来显示Windows 8的触摸键盘,但是当我需要时我无法closures它! 我试图用process.kill杀死这个进程,但是它不工作,有人有一个想法如何做到这一点? 问候Jean-Claude

新的Windows应用程序 – 什么语言?

目前,我们正在为Windows开发一个桌面应用程序。 但是当听到关于Windows 8,Silverlight,WPF,木星的所有最新讨论时,我不知道该相信什么。 现在用WPF开始一个新项目是错误的吗? 我应该切换到Silverlight吗? 还是应该等到Windows 8的更多细节出来?

CoCreateInstance在.NET中精确匹配?

我有进程(DLL)的COM服务器,但我解决了作为DllSurrogate运行,由于这个原因从非托pipe代码(delphi)我有: function TComWrapper.GetServer: IUnknown; begin OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result)); end; 从C#使用现在: [DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)] static extern UInt32 CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, IntPtr pUnkOuter, UInt32 dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject); … UInt32 dwRes = CoCreateInstance(ClassIdGuid, IntPtr.Zero, (uint)(CLSCTX.CLSCTX_LOCAL_SERVER), //if OR with CLSCTX_INPROC_SERVER then INPROC Server will be created, […]

将多个键绑定到KeyDown事件(Shift + *(Asterisk))

我试图绑定KeyDown事件上的多个键来改变一个布尔variables,但我似乎无法弄清楚如何用下面的代码中的左Shift键触发星号/星号键(*): protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Multiply || keyData == (Keys.LShiftKey | Keys.OemQuotes)) { Valgt = true; } }

如何使用WinAPI读取MessageBox文本

如何阅读标准Win消息框(Info)的消息? 运用 SendMessage(this.HandleControl, WM_GETTEXT, builder.Capacity, builder); 我只能读取消息框的头部或button的文本,而不是消息本身。 谢谢。 Notes(来自Q&A): this.HandleControl是消息框窗口的处理程序 Spy ++显示没有子控件禁止button。 这就是让我以为消息框有自己的方式来保持文本无法使用标签 这是一个用delphi编写的遗留应用程序,该button的类是按照Spy ++的TButton,但仍然没有控件,除了对话窗口内的button。 在检查记事本窗口后,图像和文本都是“可选的”,我猜我的应用程序不使用std MessageBox。 但是,我该如何解决这个问题呢? 我可以看到,我的delphi应用程序中没有标签可以通过Spy ++ Finder工具select。

处理数据库模式中的更改

我正处于开发一个应用程序的初始阶段,希望能够在1000年内销售这个应用程序,这个应用程序的数量可能会达到数百个,但是无论哪种方式都会导致数据库模式更改的头痛。 我只是限制在一个windows / .net / sql server环境中,因为我们的许多客户将自行托pipe我在他们的web服务器上构build的应用程序,并且在他们的服务器上安装的额外位数永远不会很好,总是有一个数字投诉/丢失业务。 所以sqlalchemy出来了,因为它运行在python中。 我所追求的是一个工具,可以让我在应用程序的各个版本之间轻松迁移。 我find了migrator.net,之前我用过它,但是从来没有用过,因为开发团队似乎每年只能在这个平台上工作,而不是一个活跃的项目。 有什么替代方法可用? 更新我忘了提及,我希望能够在持续集成环境中使用这个,所以虽然数据老兄和SQL比较是很好的GUI工具,我真的自动化。

安装程序自定义操作无法读取所有registry值

使用Visual Studio 2015.我试图build立一个安装程序的自定义操作,将卸载一个Excel加载项“注销”。 本质上,它需要查看HKCU\Software\Microsoft\Office键,并find任何版本号( 16.0 eg)的子键,然后查看Excel\Options子键(如果存在),并检查加载项名称在一个OPEN值中(Excel使用OPEN , OPEN1 , OPEN2等枚举在registry中的加载项)。 当我debugging我的自定义操作时,它看起来像无法看到所有的registry值。 举例来说,实际上有10个子键时,报告HKCU\Software\Microsoft\Office下有8个子键。 我猜这是由于registry虚拟化,所以我试图强制应用程序打开一个特定的registry视图如下: x64: RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64) x86: RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32) 使用这些调用的任何一个导致完全相同的有限的registry视图(我仍然看到8个键而不是10个)。 所以看起来安装程序的自定义操作由于某种原因不能强制某个特定的registry视图。 我构build了一个控制台应用程序来做一些额外的testing,控制台应用程序可以看到完整的10个键,不pipe它是否被编译为目标x64或x86平台。 我有点不知所措 这是VS2015安装项目的已知问题吗? 他们是否有能力查看registry的某些部分? 或者,这只是我的一个代码错误? 这里是我试图用来取消注册加载项,如果有帮助的代码。 我一路上添加了大量的错误检查,因为它在卸载过程中造成致命错误。 卸载现在工作(只要它不会导致崩溃),但实际上并没有取消注册加载项,因为,如上所述,它显然无法看到完整的registry。 If Registry.CurrentUser.OpenSubKey("Software\Microsoft\Office", True) IsNot Nothing Then Dim regCUOffice As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Office", True) If regCUOffice.GetSubKeyNames.Count > 0 Then For Each strKeyName As String In regCUOffice.GetSubKeyNames If […]

在文件中访问备用数据stream

在NTFS文件系统上,可以在单个文件中包含备用数据stream。 是否可以以完全pipe理的方式访问这些信息? 编辑:此外,我想从现有文件中的备用stream中读取。 这是如何实现的(如果不能使用托pipe代码,则使用PInvoke)? 这个问题是类似的,但是从2009年初,.Net的答案使用PInvoke写入文件,而不是从它读取。 从那时起,对于这个function的支持(对.net 4.0?),可以做到这一点,而不使用PInvoke?