Questions tagged «clr»

公共语言运行库(CLR)是Microsoft .NET计划的核心组件。它是Microsoft对公共语言基础结构(CLI)标准的实现,它定义了程序代码的执行环境。在CLR中,代码以称为通用中间语言(CIL,以前称为MSIL-Microsoft中间语言)的字节码形式表示。

5
尝试捕获加快我的代码?
我编写了一些代码来测试try-catch的影响,但是看到了一些令人惊讶的结果。 static void Main(string[] args) { Thread.CurrentThread.Priority = ThreadPriority.Highest; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; long start = 0, stop = 0, elapsed = 0; double avg = 0.0; long temp = Fibo(1); for (int i = 1; i < 100000000; i++) { start = Stopwatch.GetTimestamp(); temp = Fibo(100); stop = Stopwatch.GetTimestamp(); elapsed …

16
解决MSB3247-发现相同从属程序集的不同版本之间存在冲突
使用msbuild进行编译时,.NET 3.5解决方案最终出现此警告。 有时NDepend可能会有所帮助,但在这种情况下,它没有提供任何更多详细信息。像鲍勃一样,我最终不得不诉诸于ILDASM中的每个程序集,直到我找到一个引用较旧版本的从属程序集的程序。 我确实尝试使用VS 2010 Beta 2中的MSBUILD(因为Connect文章指出此问题已在CLR的下一版本中修复),但也没有提供任何更多详细信息(也许在Beta 2之后已修复) 有没有更好(更自动化)的方法?
427 .net  msbuild  clr  ndepend 

18
在CLR中投放与使用'as'关键字
在对接口进行编程时,我发现我正在做大量的转换或对象类型转换。 这两种转换方法之间有区别吗?如果是这样,是否存在成本差异,或者这对我的计划有何影响? public interface IMyInterface { void AMethod(); } public class MyClass : IMyInterface { public void AMethod() { //Do work } // Other helper methods.... } public class Implementation { IMyInterface _MyObj; MyClass _myCls1; MyClass _myCls2; public Implementation() { _MyObj = new MyClass(); // What is the difference here: …
386 c#  casting  clr 


10
“ as”和可为空的类型带来的性能惊喜
我只是在修改C#中有关可空类型的第4章,并添加了有关使用“ as”运算符的部分,该部分允许您编写: object o = ...; int? x = o as int?; if (x.HasValue) { ... // Use x.Value in here } 我认为这确实很整洁,并且可以使用“ is”后跟强制类型转换来提高C#1等效项的性能-毕竟,这种方式我们只需要进行一次动态类型检查,然后进行简单的值检查。 但是,情况似乎并非如此。我在下面提供了一个示例测试应用程序,该应用程序基本上将对象数组中的所有整数相加-但该数组包含许多空引用和字符串引用以及装箱的整数。该基准测试可测量您在C#1中必须使用的代码,这些代码使用“ as”运算符,并且仅用于启动LINQ解决方案。令我惊讶的是,在这种情况下,C#1代码的速度提高了20倍-甚至LINQ代码(考虑到涉及的迭代器,我希望它也会更慢)击败了“ as”代码。 isinst可为空的类型的.NET实现真的很慢吗?是unbox.any导致问题的其他因素吗?对此还有其他解释吗?目前,感觉就像我将不得不警告不要在性能敏感的情况下使用此功能... 结果: 演员:10000000:121 身份:10000000:2211 LINQ:10000000:2143 码: using System; using System.Diagnostics; using System.Linq; class Test { const int Size = 30000000; static void Main() …

15
有关.NET中API突破性更改的权威指南
我想收集有关.NET / CLR中API版本的尽可能多的信息,尤其是API更改如何破坏客户端应用程序。首先,让我们定义一些术语: API更改 -类型的公开可见定义的更改,包括其任何公共成员。这包括更改类型和成员名称,更改类型的基本类型,从类型的已实现接口列表中添加/删除接口,添加/删除成员(包括重载),更改成员可见性,重命名方法和类型参数,添加默认值对于方法参数,在类型和成员上添加/删除属性,以及在类型和成员上添加/删除通用类型参数(我错过了什么吗?)。这不包括成员机构的任何更改,也不包括对私人成员的任何更改(即,我们不考虑反思)。 二进制级中断 -一种API更改,导致针对旧版本API编译的客户端程序集可能不会随新版本一起加载。示例:更改方法签名,即使允许以与以前相同的方式调用它(即:void会返回类型/参数默认值重载)。 源代码级中断 -API更改,导致编写的现有代码无法针对旧版本的API进行编译,因此可能无法与新版本一起编译。但是,已编译的客户端程序集仍可以像以前一样工作。示例:添加一个新的重载,这可能导致先前明确的方法调用中的歧义。 源代码级别的静默语义更改 -API更改会导致编写的现有代码可以针对较旧版本的API进行编译,从而通过例如调用其他方法静默更改其语义。但是,该代码应继续编译而不会出现警告/错误,并且以前编译的程序集应像以前一样工作。示例:在现有类上实现新接口,导致在重载解析期间选择了不同的重载。 最终目标是对尽可能多的破坏性的和安静的语义API更改进行分类,并描述破坏的确切效果,以及受破坏影响的语言和不受破坏的语言。进一步扩展后者:尽管某些更改会普遍影响所有语言(例如,向接口添加新成员将破坏该接口在任何语言下的实现),但有些更改需要非常特定的语言语义才能发挥作用。这通常涉及方法重载,并且通常涉及隐式类型转换。即使对于符合CLS的语言(即那些至少符合CLI规范中定义的“ CLS使用者”规则的语言),似乎也没有任何方法可以定义“最小公分母”。如果有人在这里纠正我的错误,我将不胜感激-因此,这将不得不逐语言进行。自然而然,最有趣的是.NET随附的那些:C#,VB和F#。但是其他的也相关,例如IronPython,IronRuby,Delphi Prism等。极端情况越多,就会越有趣-删除成员之类的事情是不言而喻的,但是方法重载,可选/默认参数,lambda类型推断和转换运算符之间的微妙交互可能会令人惊讶有时。 几个例子来启动这个: 添加新方法重载 种类:源代码级中断 受影响的语言:C#,VB,F# 更改前的API: public class Foo { public void Bar(IEnumerable x); } 更改后的API: public class Foo { public void Bar(IEnumerable x); public void Bar(ICloneable x); } 样例客户端代码在更改前起作用,在更改后中断: new Foo().Bar(new int[0]); 添加新的隐式转换运算符重载 种类:源代码级中断。 受影响的语言:C#,VB 不受影响的语言:F# …

7
C#和Java之间的主要区别是什么?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我只想澄清一件事。这不是哪个更好的问题,我将这一部分留给其他人讨论。我不在乎。在工作面试中有人问我这个问题,我认为学到更多可能会有用。 这些是我能想到的: Java是“平台无关的”。如今,您可以说存在Mono项目,因此也可以考虑使用C#,但我认为这有点夸张。为什么?好了,当新发行的Java完成后,它同时可在其支持的所有平台上使用,另一方面,Mono实现中仍缺少多少C#3.0功能?还是我们应该在这里比较的是CLR vs. JRE? Java不支持事件和委托。我所知道的。 在Java中,所有方法都是虚拟的 开发工具:我相信还没有像Visual Studio这样的工具。尤其是如果您使用过团队版本,您将了解我的意思。 请添加您认为相关的其他人。 更新:我突然想到,Java在类,方法等上没有自定义属性,是吗?
209 c#  .net  clr  java 

20
在MSIL中可以做什么,而在C#或VB.NET中不能做什么?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 用.NET语言编写的所有代码都可以编译为MSIL,但是是否存在只能直接使用MSIL才能执行的特定任务/操作? 让我们在MSIL中也比C#,VB.NET,F#,j#或任何其他.NET语言更轻松地完成工作。 到目前为止,我们有: 尾递归 通用协/反方差 仅在返回类型上有所不同的过载 覆盖访问修饰符 有一个不能从System.Object继承的类 过滤的异常(可以在vb.net中完成) 调用当前静态类类型的虚拟方法。 获取值类型的盒装版本的句柄。 尝试/故障。 禁止名称的用法。 为值类型定义自己的无参数构造函数。 用raise元素定义事件。 CLR允许某些转换,但C#不允许。 将非main()方法设为.entrypoint。 直接使用本机int和本机unsigned int类型。 玩瞬态指针 在MethodBodyItem中发出字节指令 抛出并捕获非System.Exception类型 继承枚举(未验证) 您可以将字节数组视为int数组(小4倍)。 您可以将字段/方法/属性/事件都具有相同的名称(未验证)。 您可以从其自己的catch块分支回try块。 您可以访问famandassem访问说明符(protected internal是fam 或 assem) 直接访问<Module>用于定义全局函数的类或模块初始化器。
165 c#  .net  clr  cil 

3
.NET 4.5 beta中此FatalExecutionEngineError的原因是什么?[关闭]
这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或格外狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 下面的示例代码是自然发生的。突然,我的代码出现了一个听起来很讨厌的FatalExecutionEngineError异常。我花了30分钟的时间尝试隔离并最小化罪魁祸首样本。使用Visual Studio 2012作为控制台应用程序进行编译: class A<T> { static A() { } public A() { string.Format("{0}", string.Empty); } } class B { static void Main() { new A<object>(); } } 应该在.NET Framework 4和4.5上产生此错误: 这是一个已知的错误吗,原因是什么,我应该怎么做才能缓解它?我当前的解决方法是不使用string.Empty,但是我是否吠错了树?更改该代码的任何内容都会使其发挥预期的作用,例如,删除空的static构造函数A,或将类型参数从更改object为int。 我在笔记本电脑上尝试了此代码,但没有抱怨。但是,我确实尝试了我的主应用程序,并且它在笔记本电脑上也崩溃了。减少问题时,我一定已经整理了一些东西,我看看能否弄清楚那是什么。 我的笔记本电脑使用与框架4.0相同的代码崩溃,但即使在使用4.5时也崩溃了。两种系统都使用最新更新的VS'12(7月?)。 更多信息: IL代码(编译为Debug / Any CPU / 4.0 / VS2010(不是IDE应该重要吗?)):http : //codepad.org/boZDd98E 没有看到VS 2010与4.0。在没有优化的情况下崩溃,没有目标CPU,连接了调试器/未连接调试器,等等。- Tim …
150 c#  clr 

2
使您的.NET语言在调试器中正确执行
首先,对于这个问题的冗长,我深表歉意。 我是IronScheme的作者。最近,我一直在努力发布体面的调试信息,以便可以使用“本机” .NET调试器。 虽然这部分取得了成功,但我遇到了一些麻烦的问题。 第一个问题与步进有关。 由于Scheme是一种表达语言,与主要的.NET语言似乎都是基于语句(或行)的语言不同,所有内容都倾向于用括号括起来。 原始代码(方案)如下所示: (define (baz x) (cond [(null? x) x] [(pair? x) (car x)] [else (assertion-violation #f "nooo" x)])) 我特意将每个表达式放在换行符上。 发出的代码通过ILSpy转换为C#,如下所示: public static object ::baz(object x) { if (x == null) { return x; } if (x is Cons) { return Builtins.Car(x); } return #.ironscheme.exceptions::assertion-violation+( RuntimeHelpers.False, …

4
为什么结构对齐取决于字段类型是基本类型还是用户定义的?
在Noda Time v2中,我们正在向纳秒级分辨率发展。这意味着我们不能再使用8字节整数来表示我们感兴趣的整个时间范围。这促使我研究了Noda Time的(许多)结构的内存使用情况,这反过来又导致了我在CLR的一致性决定中发现一点奇怪之处。 首先,我意识到这是一个实现决策,并且默认行为可以随时更改。我意识到我可以使用[StructLayout]和对其进行修改[FieldOffset],但我想提出一个解决方案,该方案在可能的情况下不需要。 我的核心场景是,我的struct包含一个引用类型字段和两个其他值类型字段,其中这些字段是的简单包装int。我曾希望在64位CLR上将其表示为16个字节(参考为8个字节,其他每个为4个字节),但是由于某种原因,它使用了24个字节。顺便说一句,我正在使用数组来测量空间-我知道布局在不同情况下可能会有所不同,但这感觉是一个合理的起点。 这是演示该问题的示例程序: using System; using System.Runtime.InteropServices; #pragma warning disable 0169 struct Int32Wrapper { int x; } struct TwoInt32s { int x, y; } struct TwoInt32Wrappers { Int32Wrapper x, y; } struct RefAndTwoInt32s { string text; int x, y; } struct RefAndTwoInt32Wrappers { string text; Int32Wrapper …

6
使用加号时将创建多少个String对象?
在下面的代码中使用加号时,将创建多少个String对象? String result = "1" + "2" + "3" + "4"; 如果如下所示,我会说三个String对象:“ 1”,“ 2”,“ 12”。 String result = "1" + "2"; 我也知道String对象被缓存在String Intern Pool / Table中以提高性能,但这不是问题。
115 c#  string  clr 


2
为什么C#中的堆栈大小恰好是1 MB?
当今的PC具有大量的物理RAM,但对于32位进程,C#的堆栈大小仅为1 MB,对于64位进程,C#的堆栈大小仅为4 MB(C#中的堆栈容量)。 为什么CLR中的堆栈大小仍然如此有限? 为什么是1 MB(4 MB)(而不是2 MB或512 KB)呢?为什么决定使用这些金额? 我对该决定背后的考虑和原因感兴趣。
102 c#  stack  clr  stack-size 

8
C#是操作员的绩效
我有一个需要快速性能的程序。在其内部循环之一中,我需要测试对象的类型,以查看其是否从某个接口继承。 一种方法是使用CLR的内置类型检查功能。最优雅的方法可能是'is'关键字: if (obj is ISpecialType) 另一种方法是为基类提供我自己的虚拟GetType()函数,该函数返回预定义的枚举值(在我的情况下,实际上,我只需要一个布尔值)。该方法将很快,但不太优雅。 我听说有一个专门针对'is'关键字的IL指令,但这并不意味着它在转换为本地程序集时执行速度很快。谁能对“是”与其他方法的性能分享一些见解? 更新: 感谢您提供所有明智的答案!答案中似乎有几个有用的观点:安德鲁(Andrew)关于“是否”自动执行演员表的观点是必不可少的,但Binary Worrier和Ian收集的性能数据也非常有用。如果对其中一个答案进行编辑以包括所有这些信息,那就太好了。
102 c#  performance  clr  gettype 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.