Tag: .net

为什么“Win32_CDROMDrive”类的“SerialNumber”属性在与WMI分开请求时返回null?

当从这个SELECT SerialNumber FROM Win32_CDROMDrive获取WMI类Win32_CDROMDrive中的属性SerialNumber的值时,它会通过NullReferenceException除非我将查询更改为SELECT * FROM Win32_CDROMDrive 。 然后循环arround所有属性,包括SerialNumber in – 在这种情况下不是null。 由于第一种方法比第二种方法更快(不太确定),我更喜欢使用它。 那么发生了什么? 我错过了什么吗? 请注意,它与其他属性和类完美匹配! 这是我的代码 string result = “”; var searcher = new ManagementObjectSearcher(“SELECT SerialNumber FROM Win32_CDROMDrive”); ManagementObjectCollection collec = searcher.Get(); foreach (ManagementObject obj in collec) { result = obj[“SerialNumber”].ToString(); break; } MessageBox.Show(result); 除非我改为: var searcher = new ManagementObjectSearcher(“SELECT * FROM Win32_CDROMDrive”); 更新 […]

如何以及何时为WinForms控件处理Font

当分配任何控件的Font属性时,静态代码分析工具(来自HP的Fortify)抱怨Visual Studio Designer生成的WinForms代码。 分析工具抱怨: line 143: this.mCopyrightLabel.Font = new System.Drawing.Font(“Microsoft Sans Serif”, 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); AboutWindowForm.cs中的函数InitializeComponent()无法正确处理第143行上Font()分配的非托管系统资源。 说明: 该程序无法正确处置使用非托管系统资源的托管对象。 无法正确处置使用非托管系统资源的托管对象至少有两个常见原因: 错误条件和其他特殊情况。 混淆程序的哪个部分负责释放资源。 在这种情况下,有一些程序路径,在第143行的AboutWindowForm.cs中分配的资源没有正确处理。 托管.NET对象的一小部分使用非托管系统资源。 .NET的垃圾收集器可能无法以可预测的方式释放原始托管对象。 因此,应用程序可能耗尽可用内存,因为垃圾收集器不知道非托管资源所消耗的内存。 大多数非托管资源泄漏问题导致一般软件可靠性问题,但如果攻击者可以故意触发非托管资源泄漏,则攻击者可能会通过耗尽非托管资源池来启动拒绝服务攻击。 我已经搜索了关于在Windows窗体中处理字体一段时间的主题,这些是我收集的要点: 创建字体将占用GDI对象,这是一个非托管资源,因此在不再需要时释放非常重要 由于GDI对象昂贵且稀缺,WinForm会缓存它们。 Dispose WinForms控件还将处理其所有子控件并“释放获得的非托管资源” 如果表格是无模式的,表格将在关闭时处理 因此,我想得出结论,在VS生成的代码中没有必要显式分配给控件的Font,并且我们不应该这样做,因为字体是缓存的? 我创建了一个非常简单的表单测试程序:通过单击一个按钮,我创建了一个使用不同字体的新空表单。 关闭新打开的表单后,任务管理器中的GDI对象计数立即关闭。 这是上述要点的证据,不是吗? 然而静态分析仪似乎不相信。 它认为Font最终将由GC发布。 它还认为这对非托管资源不利,因为消耗的内存位于GC的知识之外,因此GC不会及时触发,因为GC感觉没有内存压力。 这为攻击者提供了故意触发耗尽非托管池的机会。 你能帮我理解分析仪给出的解释吗? 它对WinFroms有效吗? 手动处理创建的每个Font会很繁琐。 确切地说: 在控件的Dispose期间是否立即明确地处理Font,或者Control释放对Font的引用并让GC处理所有左边的? 谢谢! 我的问题的进一步更新:我做的另一个实验是:我在TaskManager和内存分析器中监视我的测试WinForm应用程序。 主窗体有一个按钮,用于打开另一个窗体,其单击时字体不同。 我注意到当我单击按钮并打开新窗体时,TaskManager中的GDI对象计数会增加。 因此,内存分析器观察到Font对象的计数。 但是,当我关闭新窗体时,TaskManager中的GDI对象数量立即下降。 内存探查器中Font对象的数量没有变化,这意味着GC没有发生。 但是,这些Font对象在内存分析器中被标记为“已处置但未收集”。 它给我这种感觉,当Form关闭时,Font对象设置为WinForms […]

使用FakeItEasy,是否可以创建一个采用generics类型参数的虚拟对象

我有以下测试: [Fact] public void StartProgram_CallsZoneProgramStart() { var zone = A.Fake(); zone.StartProgram(); A.CallTo(() => zone.ZoneProgram.Start(null, A.Dummy<ActionBlock>())).MustHaveHappened(Repeated.Exactly.Once); } 它正在创建一个ActionBlock类型的虚拟对象,它被传递给MustHaveHappened调用。 zone.StartProgram肯定会调用zone.ZoneProgram.Start方法,但FakeItEasy看不到此调用。 它返回以下错误消息: Assertion failed for the following call: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(, ActionBlock\`1 Id=1) Expected to find it exactly once but found it #0 times among the calls: 1: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: Faked ZoneLighting.ZoneProgramNS.InputStartingValues, interruptQueue: ActionBlock`1 Id=2) 2: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: , interruptQueue: ActionBlock`1 Id=2) […]

TFS 2010-从签入任务中获取特定版本的文件

如何从签入任务中获取特定版本的文件? 当我右键单击文件并选择历史记录时。 它向我显示“更改集”,当右键单击“更改集”并选择“获取此版本”时,它还会获取该版本的其他文件。 但我需要只采用一个文件的特定版本。

在计算2D空间中两点之间的对角线交点时如何确定+/-符号?

这是另一个问题的分支,与Keith Randall对问题的回答有关。 请快速查看图像,看看下面的function是做什么的。 简而言之,如果x2 != x1和y2 != y1则2D网格上的任何两个点都将具有两个对角交点。 我实现了以下function,但无法弄清楚如何确定从哪个单元中减去delta以及添加到哪个单元。 因此,对于某些坐标,结果是准确的,而对于其他坐标,它们是相反的。 // This class is the same as [Point] except // it uses BigInteger instead of Int32 types. public class Cell { System.Numerics.BigInteger X = 0; System.Numerics.BigInteger Y = 0; } public List GetIntersections (Cell c1, Cell c2) { List cells = new List(); System.Numerics.BigInteger delta […]

如何在WPF中使用DataGridTemplateColumn绑定用户控件失败

我想使用来自不同程序集的User控件作为DataGridTemplateColumn。 我已经看了很多例子和问题,比如这个 , 这个 , 这个和这个 。 我无法弄清楚为什么我的代码不起作用。 这里是: MainWindow.xaml MainWindow.xaml.cs namespace WpfTemplatesDemo3 { public partial class MainWindow : Window { public ObservableCollection Persons { get;set; } public MainWindow() { InitializeComponent(); this.populatePersons(); this.TableDataGrid.ItemsSource = this.Persons; } private void populatePersons() { this.Persons = new ObservableCollection(); Persons.Add(new Person { Age = 10, Name = “John0”, BirthDay = […]

C#覆盖/向对象添加方法/字段

我有一个为我创建和设置对象的库,然后我可以使用这些对象来做东西。 假设我给了“A”类对象“a” 所以我想覆盖该特定对象中的方法,我不想更改其类的代码,因为这需要更改库。 在Ruby中我可以使用Singleton Classes来做到这一点,例如: class FirstClass def test p “test” end end o = FirstClass.new class << o def test p "overridden" end def extraMethod p "ok" end end o.test # prints "overridden" o.extraMethod 现在我怎样才能在C#中做同样的事情? 更新 我最终没有使用我提交的答案,因为它太丑了,它需要更改基类中的所有私有字段以保护或公共以使它们存在于派生类中,因此我可以将值从base复制到派生。 我最终使用的方法是将从基类派生的Type传递给库并更改库,以便它使用以下命令创建实例: (A)Activator.CreateInstance(mytype, arguments);

在VS2017中将依赖程序集包含在NuGet包中

我有一个包含2个项目(NET Core)的解决方案。 第一个项目(库)包含主程序集,另一个项目(库)包含一个包含资源,接口和其他东西的程序集。 主项目引用了第二个项目。 我正在使用Visual Studio 2017.当我从主项目创建NuGet包时,附件组件不包含在包的lib文件夹中。 怎么能实现这一目标? 注意:我不想将附属程序集引用为NuGet包,我希望这个程序集成为主程序包的一部分。

更改NUnit测试的名称

我希望我的基于NUnit框架的unit testing在Visual Studio测试资源管理器中更具人性化。 例如,我最好不要使用Test_Case_1或TestCase1而是选择Test Case #1, Category: First, Category: Second (通过分配[Category]属性中的值),方法名称中不允许使用空格和字符。 我知道它在xUnit中是开箱即用的,但我不能参与其中,因为我使用的是我无法使用xUnit框架实现的自定义。 是否可以使用NUnit重写unit testing显示名称? 到目前为止,我可以看到, TestDetail FullName字段有私有的setter。 是否有其他方法或方法更改NUnit测试的显示名称?

LINQ:使用AND序列构建动态filter

我正在努力动态创建这样的查询: Dictionary parms = new Dictionary(); foreach (var kvp in parms) { var exp = ReportDefinitions.Where(x=> x.Discriminants.Any(y=> y.Key == kvp.Key && y.Value == kvp.Value) // && more conditions to add here at each cycle ); } ReportDefinitions.Discriminants是IDictionary ; 我知道如何构建简单的Expression但我无法弄清楚如何构建这个“Any”似乎真的很复杂。 Any称之为很难解决 谁知道如何处理这个?