G E*_*ves 0 c# reflection il download system.reflection
所以我是C#的中级程序员,最近我迷上了文件大小并创建了最小的文件。为此,我意识到将MSIL用于更简单的程序可以大量减少大小。
所以我尝试转换以下内容
现在,做完这些之后,我想...为什么当我可以简单地使用反射并不必使用磁盘就可以运行它们时编写文件?
那就是问题所在,我找不到解决方案。
此代码有什么问题?
.assembly a{}
.subsystem 0x0002 
.class private AA1.B 
extends [mscorlib]System.Object{ 
.method private static void a(){
.entrypoint 
.maxstack 4 
.locals init (
[0] string str,
[1] uint8[] buffer)
nop
newobj instance void [System]System.Net.WebClient::.ctor() 
ldstr  "http://www.mywebwiste.com/myDotNetFile.exe"
call instance uint8[] [System]System.Net.WebClient::DownloadData(string)
stloc.1
ldloc.1
call class [mscorlib]System.Reflection.Assembly     [mscorlib]System.Reflection.Assembly::Load(uint8[])
callvirt instance class [mscorlib]System.Reflection.MethodInfo [mscorlib]System.Reflection.Assembly::get_EntryPoint()
ldnull
ldc.i4.0
newarr object
callvirt instance object [mscorlib]System.Reflection.MethodBase::Invoke(object, object[])
}}
我编译的错误是“参考未声明的extern组装系统。” 和“引用未声明的extern程序集mscorlib”。我不是在宣布他们吗?它仍然可以编译它们,但是在运行时会崩溃。
我编译的错误是“参考未声明的extern组装系统。” 和“引用未声明的extern程序集mscorlib”。
这些不是错误,而是警告,我得到的警告的完整消息是:
警告:引用未声明的外部程序集“ mscorlib”。尝试自动检测
要消除警告,您需要声明程序集:
.assembly extern mscorlib
{
    .ver 4:0:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
.assembly extern System
{
    .ver 4:0:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
但这不是您的实际问题。如果我运行编译后的程序集,则确实会崩溃。使用Visual Studio即时调试器,您会发现例外是:
System.InvalidProgramException:公共语言运行时检测到无效程序。
这很可能意味着您的IL错误,因此您应该在其上运行PEVerify。如果这样做,则会出现此错误:
错误:[AA1.B :: a] [偏移量0x00000023]跌落到方法结尾而没有返回
这意味着您需要ret在方法末尾添加。如果解决此问题,您将获得:
错误:[AA1.B :: a] [偏移量0x00000028]从void函数返回时,堆栈必须为空。
这意味着你需要pop在object这与返回MethodBase::Invoke。
如果您解决此问题,则不会再收到PEVerify错误,并且您的代码应该可以正常工作。