Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我做错了什么?_C#_Reflection_Download_Il_System.reflection - Fatal编程技术网

C# 我做错了什么?

C# 我做错了什么?,c#,reflection,download,il,system.reflection,C#,Reflection,Download,Il,System.reflection,因此,我是一名相当中级的C#程序员,最近我一直痴迷于文件大小和创建最小的可用文件。因此,我意识到,使用MSIL进行更简单的程序可以大大减少程序的大小 因此,我尝试转换以下内容 创建一个简单的下载程序。很容易就做到了。下载我的文件并将其保存在temp中并运行它们。设法让它工作和1,5kb大小,非常有用 现在,在这样做之后,我想。。。既然我可以简单地使用反射并在不使用磁盘的情况下运行它们,为什么还要编写这些文件呢 这就是问题所在,我找不到解决办法 这个代码有什么问题 .assembly a{}

因此,我是一名相当中级的C#程序员,最近我一直痴迷于文件大小和创建最小的可用文件。因此,我意识到,使用MSIL进行更简单的程序可以大大减少程序的大小

因此,我尝试转换以下内容

  • 创建一个简单的下载程序。很容易就做到了。下载我的文件并将其保存在temp中并运行它们。设法让它工作和1,5kb大小,非常有用
现在,在这样做之后,我想。。。既然我可以简单地使用反射并在不使用磁盘的情况下运行它们,为什么还要编写这些文件呢


这就是问题所在,我找不到解决办法

这个代码有什么问题

.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[])
}}
编译时出现的错误是“引用未声明的外部程序集系统”和“引用未声明的外部程序集mscorlib”。我不是在申报吗??它仍然编译它们,但在运行时它只是崩溃了

编译时出现的错误是“引用未声明的外部程序集系统”和“引用未声明的外部程序集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.InvalidProgrameException:公共语言运行库检测到无效程序

这很可能意味着您的IL是错误的,您应该对其运行PEVerify。如果这样做,则会出现以下错误:

错误:[AA1.B::a][offset 0x00000023]在方法结尾处未返回

这意味着您需要在方法末尾添加
ret
。如果你解决了这个问题,你会得到:

错误:[AA1.B::a][offset 0x00000028]堆栈在从void函数返回时必须为空

这意味着您需要
pop
MethodBase::Invoke
返回的
对象

如果您解决了这个问题,您就不会再收到任何PEVerify错误,您的代码可能会正常工作

编译时出现的错误是“引用未声明的外部程序集系统”和“引用未声明的外部程序集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.InvalidProgrameException:公共语言运行库检测到无效程序

这很可能意味着您的IL是错误的,您应该对其运行PEVerify。如果这样做,则会出现以下错误:

错误:[AA1.B::a][offset 0x00000023]在方法结尾处未返回

这意味着您需要在方法末尾添加
ret
。如果你解决了这个问题,你会得到:

错误:[AA1.B::a][offset 0x00000028]堆栈在从void函数返回时必须为空

这意味着您需要
pop
MethodBase::Invoke
返回的
对象


如果您解决了这个问题,您就不会再遇到任何错误,您的代码也应该可以正常工作。

出于兴趣,为什么您会沉迷于文件大小?你实际上是在一个非常受限的环境中操作,还是只是出于兴趣?“这就是问题所在,我找不到解决方案”-什么问题?您已经向我们展示了一些代码,但没有指出问题所在。你应该描述你实际面临的问题。(目前还不清楚问题是如何使用反射还是IL。)我无法在工作场所使用U盘,所以这就可以完成工作。问题不在于反射是如何产生的,因为我已经在c#应用程序上进行了测试,它工作得非常好。编译时出现的错误是“引用未声明的外部程序集系统”和“引用未声明的外部程序集mscorlib”。我不是在申报吗??现在还不清楚U盘和什么有什么关系,你应该用问题的细节来更新这个问题。你有没有试过在一个大致相当的C#程序上使用
ildasm
,看看它是如何处理程序集的?出于兴趣,你为什么对文件大小如此着迷?你实际上是在一个非常受限的环境中操作,还是只是出于兴趣?“这就是问题所在,我找不到解决方案”-什么问题?您已经向我们展示了一些代码,但没有指出问题所在。你应该描述你实际面临的问题。(目前还不清楚问题是如何使用反射还是IL。)我无法在工作场所使用U盘,所以这就可以完成工作。问题不在于反射是如何产生的,因为我已经在c#应用程序上进行了测试,它工作得非常好。编译时出现的错误是“引用未声明的外部程序集系统”和“引用未声明的外部程序集mscorlib”。我不是在申报吗??现在还不清楚U盘和什么有什么关系,你应该用问题的细节来更新这个问题。您是否尝试过在大致相同的C#程序上使用
ildasm
,看看它如何处理程序集?