浅谈 C# Assembly 与 IL (一):C# Assembly 与 Reflection (3)

如果需要将程序集保存在本地,你需要在定义 Assembly 的时候使用

AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder module = assembly.DefineDynamicModule("MainModule", "NewAssembly.dll");

然后在结尾加上

assemblyBuilder.Save("NewAssembly.exe"); // 生成exe或者是dll拓展名的c#程序集

动态生成的方法在第一次运行时也会有一定的速度上的overhead,这是因为运行前还没有经过JIT compiler的编译。之后的重复运行便不会有任何速度劣势了。

总结

总体来说,Reflection 非常适合从整体结构上分析 Assembly 中的类,查看其中的 Field, Property 及其属性 Attributes,同时也能够让开发者很方便的动态的使用其中的类和方法,但它在提供方法中的IL代码的方式上真的一言难尽。其IL的获得与注入方式注定了对方法中内容难以进行具体或复杂的分析和生成,也无法做到动态的将 IL 代码注入到已有的程序集代码中,这也是我们为什么会需要 Mono.Cecil 等第三方工具的主要原因,这个我会在下一篇中介绍。

参考 Assembly:

https://docs.microsoft.com/en-us/dotnet/standard/assembly/
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly?view=net-5.0

Reflection:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodbody.getilasbytearray?view=net-5.0
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit?view=net-5.0
https://www.codeproject.com/articles/121568/dynamic-type-using-reflection-emit
https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-define-and-execute-dynamic-methods
https://flylib.com/books/en/4.453.1.58/1/
https://www.codeproject.com/Questions/494701/Can-27tplusfigureplusoutpluswhyplusthisplusDynamic

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwwpp.html