Tag: CIL

呼叫和Callvirt

CIL指令“Call”和“Callvirt”之间有什么区别?

为什么有必要调用:这个()结构在c#中使用自动属性?

如果我使用这样的自动属性在C#中定义一个结构: public struct Address { public Address(string line1, string line2, string city, string state, string zip) { Line1 = line1; Line2 = line2; City = city; State = state; Zip = zip; } public string Line1 { get; protected set; } public string Line2 { get; protected set; } public string City { get; protected […]

剖析dynamic拼贴

我正在处理MSIL分析器,并遇到ICorProfilerCallback接口的ManagedToUnmanagedTransition和UnmanagedToManagedTransitioncallback问题。 我想要检索的是关于正在调用的方法的信息(它驻留的名称和模块名称)。 到目前为止,它工作正常。 直到所谓的dynamic拼写发生(详细描述在: http : //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_ .aspx ) 在这种情况下IMetaDataImport::GetPinvokeMap失败。 另外IMetaDataAssemblyImport::GetAssemblyProps返回“dynamic_pinvoke”作为程序集的名称。 profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataImport, (IUnknown**) &imd_import, &md_token); imd_import->GetPinvokeMap(md_token, &mapping, module_name, buffer_size, &chars_read, &md_module_ref); // here the fail occurs profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataAssemblyImport, (IUnknown**) &imd_assembly_import, &md_token); imd_assembly_import->GetAssemblyFromScope(&md_assembly); imd_assembly_import->GetAssemblyProps(md_assembly, 0, 0, 0, assembly_name, buffer_size, &chars_read, 0, 0); // assembly_name is set to "dynamic_pinvoke" 如何获取模块名称(.dll)和通过dynamicpinvoke被pinvoked的函数名称?

MSIL和Java字节码的区别?

我是.Net新手,我想先了解一下基础知识。 MSIL和Java字节码有什么区别?

hidebysig在MSIL方法中的目的是什么?

使用ildasm和C#程序,例如 static void Main(string[] args) { } 得到: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 2 (0x2) .maxstack 8 IL_0000: nop IL_0001: ret } // end of method Program::Main hidebysig构造是做什么的?

为什么!0是Microsoft中间语言(MSIL)的一种types?

在许多MSIL列表中,我观察到以下内容: System.Nullable`1<!0> etc … 要么 class !0 etc … 在这种情况下, !0的含义是什么?

为什么这个(null ||!TryParse)条件导致“使用未分配的局部variables”?

以下代码导致使用未分配的局部variables“numberOfGroups” : int numberOfGroups; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } 但是,这段代码工作正常(虽然, ReSharper说= 10是多余的): int numberOfGroups = 10; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } 我错过了什么,或者编译器不喜欢我的|| ? 我已经缩小到dynamic导致的问题( options是我上面的代码中的一个dynamicvariables)。 问题仍然存在, 为什么我不能这样做 ? 这段代码不能编译: internal class Program { #region Static Methods private static void Main(string[] args) […]

Java的虚拟机和CLR

作为一种跟进称为MSIL和Java字节码之间差异的问题? Java虚拟机如何工作与如何工作有什么(主要)差异或相似之处 .NET Framework 公共语言运行时(CLR)的作品? 另外,是 .NET框架 CLR是“虚拟机”还是没有虚拟机的属性?

为什么C#编译器把这个!=比较翻译成比较呢?

我有纯粹的机会发现,C#编译器转变此方法: static bool IsNotNull(object obj) { return obj != null; } …进入这个CIL : .method private hidebysig static bool IsNotNull(object obj) cil managed { ldarg.0 // obj ldnull cgt.un ret } …或者,如果你喜欢看反编译的C#代码: static bool IsNotNull(object obj) { return obj > null; // (note: this is not a valid C# expression) } 为什么!=被翻译成“ > ”?

你可以在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>类或模块初始值设定项。