jjzjj

c# - 将 lambda 作为 IL 流传递给辅助 AppDomain,然后使用 DynamicMethod 将其组装回去

是否可以将lambda表达式作为IL字节流传递给辅助AppDomain,然后使用DynamicMethod将其组装回去以便调用它?一开始我不太确定这是正确的方法,所以这是我问这个问题的(详细)原因...在我的应用程序中,有很多情况需要加载几个程序集进行反射,这样我才能确定接下来要对它们做什么。问题部分是我需要能够在完成反射后卸载程序集。这意味着我需要使用另一个AppDomain加载它们.现在,我的大多数案例都有点相似,只是不完全相似。例如,有时我需要返回一个简单的确认,有时我需要从程序集中序列化资源流,有时我需要进行一两次回调。所以我最终写了同样的半复杂的临时文件AppDomain一遍

c# - 将 System.Object 作为类型过滤器发出的一般 catch 子句在现实世界中有何影响?

我记得有一次听说抛出System.Exception(或扩展它的对象)以外的某种类型的对象在技术上是合法的CIL,尽管C#没有支持它的功能。所以我有兴趣看到以下C#代码:try{thrownewException();}catch(Exceptionx){try{throw;}catch{Console.Write("yes");}}编译为以下CIL:.try{IL_0000:newobjinstancevoid[mscorlib]System.Exception::.ctor()IL_0005:throw}//end.trycatch[mscorlib]System.Exceptio

c# - 在 Visual Studio 中通过中间语言 (IL) 和 C# 同时进行调试

我正在寻找VisualStudio的扩展,在Debug模式下可以单步执行除C#之外的中间语言。我不是在寻找调试托管和非托管代码的解决方案。 最佳答案 你的目的是什么?您的IL是由C#编译器生成的还是在运行时动态生成的?如果是前者,您可以使用一个技巧,通过ilasm重新编译您的二进制文件。像往常一样编译C#代码。优化与否无关紧要,但您必须指定编译选项以生成完整的PDB符号。使用ildasm将您的二进制文件转换为.il文件。它是菜单中的转储选项。重新编译.il文件以获得新的二进制文件(和新的符号)ilasm.il[/exe|/dll]/

c# - C# 中的 `x is int?` 和 `x is int` 有区别吗?

classCwhereT:struct{boolM1(objecto)=>oisT;boolM2(objecto)=>oisT?;}上面的两种方法在传递null时似乎表现相同引用或盒装T值(value)。但是,生成的MSIL代码有点不同:.methodprivatehidebysiginstanceboolM1(objecto)cilmanaged{.maxstack8IL_0000:ldarg.1IL_0001:isinst!TIL_0006:ldnullIL_0007:cgt.unIL_0009:ret}对比.methodprivatehidebysiginstanceboolM2

c# - 有没有办法在 C# 中 Hook 托管函数,就像在 C++ 中 Hook 非托管函数一样?

在C++中,我会获取函数的地址并将前几个字节覆盖为我的函数的jmp,做一些事情,恢复原始字节,然后调用原始函数。我可以在C#中做这样的事情吗? 最佳答案 .NETProfilerAPI是最接近“Microsoft认可”的运行时拦截方法的方法。如前所述,这有点难以实现,而且我不知道有哪个库可以使用纯托管代码轻松实现这一点。几个月前,当我自己研究这个选项时,我偶然发现了CLRMethodInjection,这是一篇带有源代码的文章,解释了如何在运行时拦截方法。我考虑过自己使用它,甚至让示例项目运行起来,但最终得出结论,我需要的不仅仅是方

c# - 以编程方式反汇编 CIL

我可以将指令编译为字节码,甚至可以轻松执行它们,但我发现提取CIL的唯一函数是GetILAsByteArray,顾名思义,它只返回字节而不是CIL指令。那么如何在.NET上以编程方式反汇编CIL?请注意,我不希望结果采用人类可读的形式。我想编写元程序来操纵从其他程序生成的CIL。 最佳答案 您只需使用GetILAsByteArray方法中的字节数组就可以走得相当远,但是您需要自己编写字节解析(如果您不想依赖第3方库).数组的结构是,有一个或两个字节标识指令,后跟指令的操作数(什么都没有,一些4字节标记或8字节数字)。要获取代码,您可

c# - 来自动态代码的异常堆栈跟踪中的文件路径和行号错误

我们使用System.Reflection.Emit在运行时从源代码生成代码(是的——就像在编译器中一样)。我们使用MarkSequencePoint等向ILGenerator提供正确的符号信息,并在AssemblyBuilder上启用所有调试标志。程序集在编译它的同一进程中保存在内存中并直接执行。当使用VisualStudio调试器单步执行动态生成代码的源代码时,它实际上运行良好,并且VisualStudio似乎完全了解代码在文件和行号方面的来源。但是-当异常被生成的代码抛出时,System.Exception对象包含完全错误的堆栈跟踪。它们指向其他(有效但错误的)文件和行号。它得到

c# - 什么是 (fnptr)* 类型以及如何创建它?

以下IL代码创建一个名为(fnptr)*的Type实例(token0x2000000-无效,模块mscorlib.dll)。ldtokenmethodvoid*()*callclass[mscorlib]System.Type[mscorlib]System.Type::GetTypeFromHandle(valuetype[mscorlib]System.RuntimeTypeHandle)这种类型的目的是什么?是否可以在不编写任何IL代码的情况下在C#中创建此类型实例,也许使用反射?token上的Module.ResolveType抛出ArgumentOutOfRangeExcep

c# - 迭代器 block 在 IL 中生成 try-fault

在尝试使用迭代器block后,我注意到生成的IL代码不是我期望的那样。生成try-faultblock而不是try-finallyblock,这是我从未见过的。我注意到编译器不允许我在“手写”C#中使用fault关键字。两者有区别吗?C#代码:staticIEnumerableReadAllLines(stringfileName){using(varfile=System.IO.File.OpenText(fileName)){strings;while((s=file.ReadLine())!=null){yieldreturns;}}}MSIL代码:.methodprivateh

c# - 为什么局部函数生成的 IL 不同于匿名方法和 Lambda 表达式?

为什么C#7编译器将局部函数转换为其父函数所在的同一类中的方法。而对于匿名方法(和Lambda表达式),编译器会为每个父函数生成一个嵌套类,它将包含所有匿名方法作为实例方法?例如,C#代码(匿名方法):internalclassAnonymousMethod_Example{publicvoidMyFunc(string[]args){varx=5;Actionact=delegate(){Console.WriteLine(x);};act();}}将生成类似于以下内容的IL代码(匿名方法):.classprivateautoansibeforefieldinitAnonymousM