Tag: clr

在CLR上实施语言的书籍和文献

我正在寻找有关CLR(和/或可能是DLR)内部工作的书籍和文献,我的长期目标是在CLR上实现一种简单的语言。

C#强制转换为可空类型?

除了 Cast和As之间经常无聊的区别 如果我知道 苹果是一种水果所以我可以使用(Fruit)apple – 如果不是它会引发exception as value可以检查as value是否为null以查看是否成功[将不会抛出exception…] 不过我一直在阅读@EricLippert关于此的文章 ,并且有一个关于Nullable Value Types的很好的示例: short? s = (short?)123; int? i = s as int?; 这不会编译…… 无法转换类型’短?’ ‘int?’ 通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换 精细。 为什么这样: short? s = (short?)123; int? i = (int?)s; 编译? ( 违背所有期望 !我知道 s不是int? – 它应该是BANG但它不是……) 这里的演员阵容应该比前一个例子(轰动了)更加致命 我对这个备受关注的话题感到很难过。 提前致谢。

在c#中将bool表达式转换为char

当我遇到类似下面的问题时,我通过了.NET测验。 Char ch = Convert.ToChar(‘a’ | ‘e’ | ‘c’ | ‘a’); 在控制台中我们可以看到ch变量的输出是g 。 有人可以描述发生了什么吗? 谢谢!

使用System.Threading.Tasks.Parallel在线程池中创建新线程?

也许我不理解它…所有Parallel类问题:( 但是从我现在正在阅读的内容中,我了解到当我使用Parallel时,我实际上调动了threadPool中存在的所有线程以执行某些任务/任务。 例如 : var arrayStrings = new string[1000]; Parallel.ForEach(arrayStrings, someString => { DoSomething(someString); }); 因此,在这种情况下,Parallel.ForEach正在调动threadPool中存在的所有线程,用于’DoSomething’任务/任务。 但调用Parallel.ForEach会不会创建任何新线程? 很明显,没有1000个新线程。 但是我们假设有1000个新线程,有些情况下threadPool会释放它所拥有的所有线程,在这种情况下…… Parallel.ForEach会创建任何新线程吗?

为什么CLRexception发生FatalExecutionEngineError?

我们正在使用封装数值的结构,我发现当在表达式中使用此结构的可空版本时,会发生FatalExecutionEngineError : 附加信息:运行时遇到致命错误。 错误的地址位于0x729c1e04,位于线程0x52d8上。 错误代码是0xc0000005。 此错误可能是CLR中的错误,也可能是用户代码的不安全或不可validation部分中的错误。 此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。 我正在使用Visual Studio Premium 2013 Update 3这是源代码(C#,目标.NET Framework 4.5): using System; using System.Globalization; namespace ConsoleApplication4 { public struct Number { ValueType _val; private Number(double val) { this._val = val; } public static implicit operator double(Number val) { return Convert.ToDouble(val._val, CultureInfo.InvariantCulture); } public static implicit operator Number(double val) { return […]

UnderlyingSystemType何时与当前Type实例不同

System.Type包含UnderlyingSystemType属性。 Msdn 表示 : 指示表示此类型的公共语言运行库提供的类型。 在大多数情况下,此属性只返回当前的Type实例。 我的问题是,在什么情况下此属性不返回当前的Type实例本身。 在这些情况下,当前的Type实例和返回的底层系统类型是什么类型的?

pt 2,无法捕捉的例外

更新:我已经在Microsoft Connect上提交了错误报告: https : //connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details 如果您可以在您的计算机上重现此问题,请提供该错误以便修复它! 好的,我已经做了一些测试,我把问题简化为非常简单的事情: 一世。 在抛出exception的新类中创建方法: public class Class1 { public void CallMe() { string blah = null; blah.ToLower(); } } II。 创建一个MethodInfo,在其他地方指向此方法: Type class1 = typeof( Class1 ); Class1 obj = new Class1(); MethodInfo method = class1.GetMethod( “CallMe” ); III。 在try / catch块中包含对Invoke()的调用: try { method.Invoke( obj, null ); // exception […]

什么是LINQ实际编译到?

背景 这样做的背景是我最近在评论中与另一位知识渊博的用户讨论了如何编译LINQ。 我首先“总结”并说LINQ被编译为for循环。 虽然这是不正确的,但是我对其他堆栈的理解是,LINQ查询被编译为lambda,其中包含一个循环。 然后在第一次枚举变量时调用它(之后存储结果)。 另一个用户表示LINQ需要额外的优化,例如散列。 我找不到支持或反对的任何支持文档。 我知道这似乎是一个非常模糊的观点,但我一直觉得,如果我不理解某些东西是如何完全运作的,那么我很难理解为什么我没有正确使用它。 问题 所以,让我们采取以下非常简单的例子: var productNames = from p in products where p.Id > 100 and p.Id < 5000 select p.ProductName; 在CLR中实际编译的这个语句是什么? LINQ接管了什么优化只是编写一个手动解析结果的函数? 这只是语义还是还有更多呢? 澄清 很明显我问这个问题是因为我不明白LINQ“黑匣子”的内部是什么样的。 尽管我理解LINQ很复杂(而且function强大),但我主要是在寻找对CLR或与LINQ语句等效的function的基本理解。 有很多很棒的站点可以帮助理解如何创建LINQ语句,但是很少有这些站点可以提供有关如何实际编译或运行这些语句的任何指导。 旁注 – 我绝对会阅读关于linq的John Skeet系列文章。 附注2 – 我不应该将其标记为LINQ to SQL。 我理解ORM和微观ORM是如何工作的。 这真的是问题的重点。

为什么.NET JIT编译器决定不内联或优化对没有副作用的空静态方法的调用?

我认为我正在观察.NET JIT编译器没有内联或优化对没有副作用的空静态方法的调用,考虑到一些直言不讳的在线资源,这有点令人惊讶。 我的环境是x64,Windows 8.1,.NET Framework 4.5上的Visual Studio 2013。 鉴于这个简单的测试程序( https://ideone.com/2BRCpC ) class Program { static void EmptyBody() { } static void Main() { EmptyBody(); } } 通过优化上述程序的发布版本为Main和EmptyBody生成以下MSIL: .method private hidebysig static void Main() cil managed { .entrypoint // Code size 6 (0x6) .maxstack 8 IL_0000: call void Program::EmptyBody() IL_0005: ret } // end of method […]

如何在运行时后期绑定32位/ 64位lib

我遇到的问题与此处描述的类似,但略有不同(加载程序集及其依赖项)。 我有一个用于3D渲染的C ++ DLL,这是我们向客户销售的产品。 对于.NET用户,我们将有一个CLR包装器。 C ++ DLL可以在32位和64位版本中构建,但我认为这意味着我们需要有两个CLR包装器,因为CLR绑定到特定的DLL? 现在说我们的客户有一个可以是32位或64位的.NET应用程序,并且它是一个纯粹的.NET应用程序,它让CLR从一组程序集中解决它。 问题是应用程序代码如何在运行时动态选择我们的32位和64位CLR / DLL组合? 更具体地说,这里适用的上述问题的建议答案也是如此(即创建一个ResolveEvent处理程序)?