Tag: clr

属性或get / set方法对对象大小的影响

就对象大小而言,如果公开的属性不表示状态而只是将其getter和setter调用委托给另一个实体,那么属性如何取代Get / Set方法会影响对象大小? 例如,请考虑以下类: public class Person { Address _address = new Address(); public string AddressName { get{ return _address.Name; } set { _address.Name = value; } } public string GetAddressName(){ return _address.Name; } public void SetAddressName(string name){ _address.Name = name; } } public Address { public string Name { get; set; } } 我猜测当创建一个新Person时,CLR在确定要分配多少内存时将考虑AddressName属性的潜在大小。 […]

如何将LINQ分区为对象查询?

这是资源分配问题。 我的目标是运行查询以获取任何时隙的最高优先级class次。 数据集非常大。 对于这个例子,假设1000家公司各有100个class次(尽管真实数据集更大)。 它们都被加载到内存中,我需要对它们运行一个LINQ to Objects查询: var topShifts = (from s in shifts where (from s2 in shifts where s2.CompanyId == s.CompanyId && s.TimeSlot == s2.TimeSlot orderby s2.Priority select s2).First().Equals(s) select s).ToList(); 问题在于,如果没有优化,LINQ to Objects将比较两个集合中的每个对象,进行所有1,000 x 100与1,000 x 100的交叉连接,这相当于100亿(10,000,000,000)个比较。 我想要的是只比较每个公司内的对象(就像公司在SQL表中被索引一样)。 这将产生1000组100×100个对象,总计1000万(10,000,000)个比较。 随着公司数量的增长,后者将线性扩展而不是指数级扩展。 像I4o这样的技术可以让我做这样的事情,但不幸的是,我没有在我正在执行这个查询的环境中使用自定义集合的奢侈。 此外,我只希望在任何给定的数据集上运行此查询一次,因此持久索引的值是有限的。 我希望使用一种扩展方法,它可以按公司对数据进行分组,然后在每个组上运行表达式。 完整示例代码: public struct Shift { public static long Iterations; […]

内存堆安全性:字符串垃圾收集

我最近一直在为我的公司进行安全代码审查,并使用名为Fortify360的工具。 它将识别代码的许多问题并描述问题。 它提出的一个有趣的问题是我没有找到任何其他信息如下: “存储在内存中的敏感数据(如密码)如果存储在托管的String对象中,可能会泄露。字符串对象没有固定,因此垃圾收集器可以随意重定位这些对象,并在内存中留下几个副本。这些对象是默认情况下没有加密,所以任何能够读取进程内存的人都能看到内容。此外,如果进程’内存被换出到磁盘,则字符串的未加密内容将被写入交换文件。 ,因为String对象是不可变的,所以只能通过CLR垃圾收集器从内存中删除String的值。除非CLR内存不足,否则不需要运行垃圾收集器,因此不能保证何时垃圾将发生收集。如果应用程序崩溃,应用程序的内存转储可能会泄露敏感数据。“ 所有这些我理解为很有道理,而且我对这个问题的研究非常标准。 问题是:我该如何解决这个问题? 假设有问题的类不能从iDisposableinheritance(非常大的应用程序,并且在所讨论的字符串之后很久就需要该类)。 是否有另一种手动内存管理方式来处理特定字符串而不调用垃圾收集器,GC.Collect()?? 提前感谢您的帮助。 亚历克斯

是否可以将标记有MethodImplOptions.InternalCall的方法链接到其实现?

在尝试查找exception的可能原因时,我正在使用Reflector跟踪代码路径。 我已经越来越深入,但结果是一个方法调用看起来像: [MethodImpl(MethodImplOptions.InternalCall)] private extern void SomeMethod(int someParameter); 该方法的这个标记告诉框架在某处调用C ++函数。 有没有办法找出实际调用的方法,反过来又可能调用什么方法? 注意:我真的不想看到这个方法的源代码,我只是想知道可能抛出exception的东西,我看到它来自这个方法调用。

我可以阻止CLR优化掉调试信息吗?

我为unit testing编写了一个抽象基类,为我们的测试运行设置了足够的环境。 该类将一些运行时环境位公开为属性,其类型因test而异(属性类型是inheritance的具体测试类中指定的类型参数)。 这一切都很好,除了一位同事发现他无法在调试器中查看任何类的属性。 原因是他没有在他的inheritance类中定义字段,并且CLR优化了某些东西,所以调试器无法显示属性。 是否有可能以某种方式在基类中防止这种情况,或者我是否必须告诉每个人他们需要定义至少一个在测试期间某处使用的字段? 编辑: 听起来像一个可能的罪魁祸首应该是优化/调试设置。 也就是说,我正在调试模式下从Visual Studio构建应用程序,我已经仔细检查了所有项目都是为调试版本设置的,并且此解决方案中的所有项目都没有设置Optimize标志。 也许有必要注意我正在使用MSTest和Visual Studio测试运行器。 编辑2: 通过“无法查看属性”我指的是当我在Quickwatch中评估属性并获得红色感叹号和文本“无法评估表达式”错误文本时。 并且为了避免你认为我完全偏离我的怀疑,添加一个在测试初始化​​方法中初始化的实例字段会使问题消失…… 编辑3: 检查构建输出。 我注意到使用以下选项调用编译器: /debug+ /debug:full /optimize- /define:DEBUG,TRACE 我认为这足以阻止这种情况发生,但是你去了。 🙂

无法获得价值因为它已被优化掉了

我有调试问题…突然间我在调试时看不到大多数变量的值。 我已经设法在立即窗口中获得两个不同的消息: 无法获取本地或参数’参数’的值,因为它在此指令指针处不可用,可能是因为它已被优化掉。 和 表达式计算器中的内部错误。 我试过并检查了以下内容: 解决方案配置设置为调试( 不发布) 项目 – >设置 – >构建 – > 未设置优化代码 工具 – >选项 – >调试 – >使用Managaed兼容模式(不起作用) 你有什么进一步的想法我可以再次正确调试吗? 🙁 提前致谢 编辑代码没什么特别的……当我尝试观察内部参数[Key]时会发生这种情况 public void AddOrUpdateQuartzJob(string jobName, IList<KeyValuePair> parameters) { var jobDetail = this.GetJobDetail(jobName); if (jobDetail != null) { foreach (var parameter in parameters) { jobDetail.JobDataMap[parameter.Key] = parameter.Value; } } else […]

为什么声明是必要的

我目前正在教同事.Net,他问我一个困扰我的问题。 我们为什么要申报? 如果var是隐式输入,为什么我们甚至要声明? Animal animal = new Animal(); 变 var animal = new Animal(); 可能成为 animal = new Animal(); 隐式类型仍然意味着这是一个静态类型变量。 如果为变量分配了两种不同的类型,如果它们不共享基类(除了对象),则可能是编译器错误。 是否有技术原因无法完成或风格上我们喜欢有没有

.NET JIT编译性能(包括动态方法)如何受C#编译器的映像调试选项的影响?

我正在尝试优化我的应用程序,以便它在启动后立即运行良好。 目前,它的发行版包含304个二进制文件(包括外部依赖项),总计57兆字节。 它是一个主要进行数据库访问的WPF应用程序,没有任何重要的计算。 我发现Debug配置为大多数操作提供了更好的(~5倍增益)时间,因为它们是在应用程序进程的生命周期中第一次执行。 例如,在应用程序中打开特定屏幕,NGENed Debug需要0.3秒,JITted Debug需要0.5秒,NGENed Release需要1.5秒,JITted Release需要2.5秒。 我知道JIT编译时间的差距是由JIT编译器对Release二进制文件应用更积极的优化引起的。 据我所知,Debug和Release配置因传递给C#编译器的/p:DebugType和/p:Optimize开关而不同,但即使用/p:Configuration=Release /p:DebugType=full /p:Optimize=false构建应用程序,我也看到相同的性能差距/p:Configuration=Release /p:DebugType=full /p:Optimize=false – 即与/p:Configuration=Debug相同的映像调试选项。 我确认通过查看应用于生成的程序集的DebuggableAttribute应用这些选项。 观察NGEN输出,我看到添加到正在编译的一些程序集的名称中 – NGEN如何区分调试和非调试程序集? 正在测试的操作使用动态代码生成 – 动态代码应用了什么级别的优化? 注意:由于外部依赖性,我使用的是32位框架。 我应该期待x64有不同的结果吗? 注意:我也不使用条件编译。 因此,两种配置的编译源都相同。

C#中子字符串的意外行为

.net System.String类中的Substring()方法的定义是这样的 public string Substring(int startIndex) 其中startIndex是根据方法定义的“此实例中子字符串从零开始的起始字符位置” 。 如果我理解正确,这意味着它将给我一部分字符串,从给定的从零开始的索引开始。 现在,如果我有一个字符串”ABC”并使用不同索引的子字符串,我得到以下结果。 var str = “ABC”; var chars = str.ToArray(); //returns 3 char ‘A’, ‘B’, ‘C’ as expected var sub2 = str.Substring(2); //[1] returns “C” as expected var sub3 = str.Substring(3); //[2] returns “” …!!! Why no exception?? var sub4 = str.Substring(4); //[3] throws ArgumentOutOfRangeException as expected […]

将程序集版本重定向到不同的CLR / GAC

我有一个关于2个CLR版本的问题,即.NET框架的版本2和版本4,它们使用不同的GAC位置。 我有一个客户端应用程序,它引用了v2 GAC(C:\ Windows \ Assembly)中的程序集“X”。 我现在正在更新程序集“X”以在.NET框架的v4(C:\ Windows \ Microsoft.NET \ assembly)上运行,但是,我不想重新编译客户端应用程序。 注意,在安装到v4 GAC之前,会从v2 GAC中删除程序集“X”。 是否可以创建一个发布者策略文件,该文件将以前驻留在CLR版本2中的程序集重定向到CLR的版本4? 如果是这样,这是如何实现的? 我搜索了MSDN,并了解assemblyBinding元素上有一个applyTo字段,您可以在其中指定.NET框架的版本,但这似乎包含整个绑定。 我想要的是: 我在这里阅读http://msdn.microsoft.com/en-us/magazine/dd727509.aspx,CLR v2.0应用程序现在无法在GAC中看到CLR v4.0程序集。 但是,您可以强制应用程序使用更新的CLR: 那么这个加上出版商政策的混合物是否足够,还是有另一种方式?