Tag: clr

ValueTypes如何从Object(ReferenceType)派生,仍然是ValueTypes?

C#不允许从类派生结构,但所有的ValueType派生自Object。 这个区别在哪里? CLR如何处理这个问题?

自动创build空的C#事件处理程序

在C#中没有附加处理程序的事件是不可能的。 所以在每次调用之前,都需要检查事件是否为空。 if ( MyEvent != null ) { MyEvent( param1, param2 ); } 我想保持我的代码尽可能干净,摆脱这些空检查。 我不认为这会影响performance,至less不会影响我的performance。 MyEvent( param1, param2 ); 现在我通过手动为每个事件添加一个空的内联处理程序来解决这个问题。 这是错误的容易,因为我需要记住这样做等。 void Initialize() { MyEvent += new MyEvent( (p1,p2) => { } ); } 有没有办法使用reflection和一些CLR魔法自动生成给定类的所有事件的空处理程序?

SQL Server:如何检查CLR是否启用?

SQL Server 2008 – 什么是检查是否启用clr的简单方法?

为JVM实现C#

有没有人试图为JVM实现C#? 作为一名Java开发人员,我一直嫉妒C#,但不愿意放弃JVM的可移植性和成熟性,更不用说为它提供各种各样的工具了。 我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最好的?

使用加号时会创build多less个String对象?

在下面的代码中使用加号时会创build多less个String对象? String result = "1" + "2" + "3" + "4"; 如果是这样,我会说三个string对象:“1”,“2”,“12”。 String result = "1" + "2"; 我也知道String对象被caching在String Intern Pool / Table中以提高性能,但这不是问题。

为什么结构alignment取决于字段types是基本的还是用户定义的?

在Noda Time v2中,我们正在转向纳秒级的分辨率。 这意味着我们不能再使用一个8字节的整数来表示我们感兴趣的整个时间范围。这促使我调查了Noda Time(许多)结构的内存使用情况,这又导致了我在CLR的协调决定中发现一个轻微的怪异。 首先,我意识到这是一个实现的决定,而且默认行为随时可能改变。 我意识到我可以使用[StructLayout]和[FieldOffset] 来修改它,但我宁愿想出一个解决scheme,如果可能的话,不要求这样做。 我的核心场景是,我有一个struct ,其中包含一个引用types的字段和其他两个值types的字段,其中这些字段是简单的包装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 […]

让你的.NET语言在debugging器中正确的步骤

首先,我对这个问题的长度表示抱歉。 我是IronScheme的作者。 最近,我一直在努力发布体面的debugging信息,以便我可以使用“本地”.NETdebugging器。 虽然这部分取得了成功,但我却遇到了一些小问题。 第一个问题与步进有关。 由于Scheme是一种expression式语言,所有东西都倾向于用括号包装,而不像似乎是基于语句(或行)的主要.NET语言。 原始代码(Scheme)如下所示: (define (baz x) (cond [(null? x) x] [(pair? x) (car x)] [else (assertion-violation #f "nooo" x)])) 我有目的地在换行符上列出每个expression。 发出的代码转换为C#(通过ILSpy)看起来像: 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, "nooo", Builtins.List(x)); } 正如你所看到的,非常简单。 注意:如果代码在C#中被转换成条件expression式(?:),整个事情只是一个debugging步骤,请记住。 […]

.NET 4.5 beta中这个FatalExecutionEngineError的原因是什么?

下面的示例代码自然发生。 突然我的代码哇,一个非常讨厌的冠冕堂皇的FatalExecutionEngineErrorexception。 我花了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框架4和4.5上应该产生这个错误: 这是一个已知的错误,是什么原因,我能做些什么来缓解呢? 我目前的工作是不使用string.Empty ,但我吠叫错了树? 改变代码的任何东西都会使得它的function如你所期望的那样 – 例如移除A的空静态构造函数,或者将types参数从object改为int 。 我在我的笔记本上试过这个代码,它没有抱怨。 不过,我尝试了我的主要应用程序,它也在笔记本电脑上崩溃。 在减less问题的时候,我一定已经把事情弄糟了,我会看看能不能弄清楚是什么。 我的笔记本电脑与上述相同的代码崩溃,与框架4.0,但主要崩溃,甚至4.5。 两个系统都使用VS'12进行最新更新(7月?)。 更多信息 : IL代码(编译debugging/任何CPU / 4.0 / VS2010(不是IDE应该重要?)): http : //codepad.org/boZDd98E 没有见过VS […]

你可以在MSIL中做什么,你不能在C#或VB.NET中做什么?

所有使用.NET语言编写的代码都会编译为MSIL,但是您可以直接使用MSIL来执行特定的任务/操作吗? 让我们在MSIL上做的事情也比C#,VB.NET,F#,j#或其他任何.NET语言更容易。 到目前为止我们有这个: 尾recursion 一般Co / Contravariance 重载仅在返回types中有所不同 覆盖访问修饰符 有一个不能从System.Objectinheritance的类 过滤的exception(可以在vb.net中完成) 调用当前静态类types的虚方法。 获取值types的盒装版本的句柄。 做一个尝试/错误。 禁止使用的名称。 为值types定义自己的无参数构造函数 。 用一个raise元素定义事件。 CLR允许一些转换,但C#不允许。 做一个非main()方法作为.entrypoint 。 直接使用本地int和本地unsigned inttypes。 玩瞬态指针 MethodBodyItem中的emitbyte指令 抛出并捕获非System.Exceptiontypes inheritance枚举(未validation) 您可以将一个字节数组作为一个(4x小)的整数数组。 你可以有一个字段/方法/属性/事件都具有相同的名称(未validation)。 你可以从自己的catch块分支回try块。 您可以访问famandassem访问说明符( protected internal是fam 或汇编) 直接访问用于定义全局函数的<Module>类或模块初始值设定项。

.NET中API断开更改的权威指南

我想尽可能多地收集有关.NET / CLR中API版本化的信息,特别是API更改如何做或不做中断客户端应用程序。 首先,我们来定义一些术语: API更改 – 对types的公开可见定义(包括其任何公共成员)的更改。 这包括更改types和成员名称,更改types的基types,从types的已实现接口列表中添加/删除接口,添加/删除成员(包括重载),更改成员可见性,重命名方法和types参数,添加默认值对于方法参数,在types和成员上添加/删除属性,以及在types和成员上添加/删除genericstypes参数(我错过了什么?)。 这不包括成员机构的任何变化,或私人成员的任何变化(即我们没有考虑到反思)。 二进制级别中断 – API更改导致客户端程序集针对旧版API进行编译,可能无法使用新版本加载。 示例:更改方法签名,即使它允许以与以前相同的方式调用(即:void返回types/参数默认值重载)。 源代码级别中断 – API更改导致现有代码被编写为针对较早版本的API进行编译,可能无法使用新版本进行编译。 但是,已编译的客户端程序集像以前一样工作。 例如:添加一个新的重载,可能导致以前明确的方法调用不明确。 源代码级安静语义更改 – 导致现有代码写入API的老版本API进行编译的API更改会悄悄地改变其语义,例如通过调用不同的方法。 该代码应该继续编译没有警告/错误,以前编译的程序集应该像以前一样工作。 例如:在现有的类上实现一个新的接口,导致在重载parsing期间select不同的过载。 最终的目标是尽可能多地编目尽可能多的破坏性和安静的语义API变化,描述破坏的确切效果,以及哪些语言不受其影响。 为了扩展后者:尽pipe一些变化普遍影响所有语言(例如,向接口添加新成员将会以任何语言破坏该接口的实现),但是一些需要非常特定的语言语义来进入rest。 这通常涉及方法重载,并且通常涉及任何与隐式types转换有关的操作。 在这里,即使对于符合CLS的语言(即至less符合CLI规范中定义的“CLS消费者”规则的语言),在这里似乎也没有任何方法来定义“最小公分母” – 尽pipe我会欣赏有人纠正我在这里是错误的 – 所以这将不得不通过语言去语言。 那些最感兴趣的人自然就是.NET开箱即用的:C#,VB和F#; 但是其他的如IronPython,IronRuby,Delphi Prism等也是相关的。 angular落案例越多,它就越有意思 – 像删除成员这样的事情是不言而喻的,但是,例如方法重载,可选/默认参数,lambdatypes推断和转换操作符之间的微妙交互可能是非常令人惊讶的有时。 几个例子来启动这个: 增加新的方法重载 种类:源级别中断 受影响的语言:C#,VB,F# 更改前的API: public class Foo { public void Bar(IEnumerable x); } 更改后的API: public class Foo […]