cil

【转】Aspnet Core为什么支持跨平台

拥有回忆 提交于 2020-04-10 09:09:02
1.框架决定--因为代码运行需要环境,有了能够运行在 Windows和Linux下面的 CLR. 2.netCore有了个 kestrel(具体的解释去查询下).跨平台的适用于ASP.NET Core的WEB服务器。角色类似 IIS,他不是IIS, 简单的说 kestrel的性能高,功能少,在Linux下性能更高,不支持反向代理。 先来看一下.NET Framework和Core的大体结构 NET Framework本身是个"跨Windows"的平台, 而在这个基础上, 又支持C#和VB等语言进行 "跨语言", 这些语言都遵守CLS, 编译成CIL执行. 从我们多层架构设计的角度来看, 只换最底层, 还是很可行的. .NET Core 重做了一个CoreCLR的运行时,以及一个叫做CoreFX的BCL. 这里要说一下, ASP.NET Core 完全作为 NuGet 包的一部分提供。 这样一来,可以将应用优化为只包含必需 NuGet 包, 使应用更加灵活、模块化的同时提高性能. .NET Core通过实现.NET Standard与 .NET Framework做兼容. 至于跨平台, 因为90%的CoreFX代码都是与平台无关的 https://www.cnblogs.com/huaan011/p/12204883.html https://blog.csdn.net

How optimized is the C# compiler? [duplicate]

流过昼夜 提交于 2020-03-24 09:57:10
问题 This question already has answers here : MS C# compiler and non-optimized code (3 answers) Closed 4 years ago . The IL code (generated with https://dotnetfiddle.net) of this piece of code: public class Program { public static void Main() { int i = 10; if (i < 4) Console.WriteLine("Hello World"); } } contains ldstr "Hello World". Shouldn't the compiler know that Console.WriteLine never gets executed? The IL code of this: public class Program { public static void Main() { if (10 < 4) Console

堆栈的目的是什么?我们为什么需要它?

∥☆過路亽.° 提交于 2020-03-18 21:28:18
3 月,跳不动了?>>> 所以我现在正在学习MSIL来学习调试我的C#.NET应用程序。 我一直想知道: 堆栈的目的是什么? 只是将我的问题放在上下文中: 为什么从内存转移到堆栈或“加载?” 另一方面,为什么会从堆栈转移到内存或“存储”? 为什么不将它们全部放在内存中? 是因为它更快吗? 是因为它基于RAM吗? 为了效率? 我正在努力掌握这一点,以帮助我更深入地理解 CIL 代码。 #1楼 关于此,有一篇非常有趣/详细的维基百科文章 ,堆栈机器指令集的优点 。 我需要完全引用它,所以简单地放一个链接就更容易了。 我只想引用子标题 非常紧凑的目标代码 简单的编译器/简单的解释器 最小的处理器状态 #2楼 如果没有遵循堆栈/堆的概念并且数据被加载到随机存储器位置或者数据是从随机存储器位置存储的......它将是非常非结构化的和非托管的。 这些概念用于在预定义的结构中存储数据,以提高性能,内存使用......以及因此称为数据结构。 #3楼 请记住,当您谈论MSIL时,您正在谈论 虚拟 机的说明。 .NET中使用的VM是基于堆栈的虚拟机。 与基于寄存器的VM相反,Android操作系统中使用的 Dalvik VM 就是一个例子。 VM中的堆栈是虚拟的,由解释器或即时编译器将VM指令转换为在处理器上运行的实际代码。 在.NET的情况下几乎总是一个抖动

Visual Studio“任何CPU”目标是什么意思?

浪子不回头ぞ 提交于 2020-02-27 02:09:55
我对Visual Studio 2008中的.NET平台生成选项有些困惑。 什么是“任何CPU”编译目标,它生成什么样的文件? 我检查了此“任何CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁看不到它!)。 那么,将可执行文件定向到x86与“任何CPU”之间有什么区别吗? 我注意到的另一件事是,托管C ++项目没有该平台作为选项。 这是为什么? 这是否意味着我怀疑“任何CPU”可执行文件都是纯32位可执行文件? #1楼 我认为已经讲了大多数重要的内容,但我只是想补充一件事:如果您以 Any CPU的 身份进行编译并在x64平台上运行,那么您将无法加载32位DLL文件,因为您的应用程序不是在 WoW64中 启动的,但是那些DLL文件需要在其中运行。 如果编译为x86,则x64系统将在WoW64中运行您的应用程序,并且您将能够加载32位DLL文件。 因此,我认为如果依赖项可以在两种环境中运行,则应该选择“任何CPU”,但是如果您具有32位依赖项,则应该选择x86。 Microsoft的这篇文章对此做了一些解释: / CLRIMAGETYPE(指定CLR图像的类型) 顺便提及, 其他Microsoft文档也 同意x86通常是更可移植的选择: 选择x86通常是应用程序包最安全的配置,因为它几乎可以在所有设备上运行。 在某些设备上,具有x86配置的应用程序包将无法运行

何时使用vs ref vs out

*爱你&永不变心* 提交于 2020-02-26 21:42:11
前几天有人问我应该使用参数关键字 out 而不是 ref 。 虽然我(我认为)理解了 ref 和 out 关键字之间的差异( 之前 已经 提到过 ),最好的解释似乎是 ref == in and out ,什么是一些(假设的或代码的)例子我应该总是 out 而不是 ref 。 由于 ref 更为通用,为什么你想 out ? 它只是语法糖吗? #1楼 它取决于编译上下文(参见下面的示例)。 out 和 ref 都表示通过引用传递的变量,但 ref 要求变量在传递之前被初始化,这可能是Marshaling上下文中的一个重要区别(Interop:UmanagedToManagedTransition,反之亦然) MSDN警告 : Do not confuse the concept of passing by reference with the concept of reference types. The two concepts are not the same. A method parameter can be modified by ref regardless of whether it is a value type or a reference type. There is no boxing of a value type when it is passed by

Calling a method of existing object using IL Emit

守給你的承諾、 提交于 2020-02-25 04:16:08
问题 I am attempting to write an attribute based interceptor (something similar to DynamicProxy ). The idea being, based on certain custom attributes, a method inside that attribute would be called, i.e. Call a method inside attribute class before actual method is called. Call the actual method. I am able to override existing method using MethodBuilder and TypeBuilder . However, I can't figure out how to call the method inside the Attribute. My code : static void CreateMethods<T>(TypeBuilder tb) {

Calling a method of existing object using IL Emit

丶灬走出姿态 提交于 2020-02-25 04:15:28
问题 I am attempting to write an attribute based interceptor (something similar to DynamicProxy ). The idea being, based on certain custom attributes, a method inside that attribute would be called, i.e. Call a method inside attribute class before actual method is called. Call the actual method. I am able to override existing method using MethodBuilder and TypeBuilder . However, I can't figure out how to call the method inside the Attribute. My code : static void CreateMethods<T>(TypeBuilder tb) {

Closure allocations in C#

不想你离开。 提交于 2020-02-19 09:46:41
问题 I've installed the Clr Heap Allocation Analyzer extension and in a project I see something that I quite don't understand, I've got a method with a signature public Task<int> ExecuteAsync(string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { param = SetModificationValuesForGlobalRing(param); return _sqlPolicy.ExecuteAsync(async () => { int result; using (var connection = new SqlConnection(_connectionString)) { await

Retrieve Local variable name from PDB files

巧了我就是萌 提交于 2020-01-28 09:56:27
问题 i'm currently trying to retrieve source code from IL bytecodes and PDB files, i'm arrived to the point where i can generate source code from IL and reflection i know the name of local variable names is included in the pdb file. My question is how can i find it back ? what libs should i use to handle the pdb files (if any) or should i write the code myself ? where can i find information about pdb file format ? currently in the generated sourcecode i'm using auto generated values for local

Retrieve Local variable name from PDB files

旧城冷巷雨未停 提交于 2020-01-28 09:56:14
问题 i'm currently trying to retrieve source code from IL bytecodes and PDB files, i'm arrived to the point where i can generate source code from IL and reflection i know the name of local variable names is included in the pdb file. My question is how can i find it back ? what libs should i use to handle the pdb files (if any) or should i write the code myself ? where can i find information about pdb file format ? currently in the generated sourcecode i'm using auto generated values for local