当我使用aspnet_compiler重新编译我的项目(asp.net,c#)时,即使没有进行任何代码更改,重建的二进制文件也会更改(与之前的版本相比).
据我所知,这是因为构建每次构建时都会生成一个新的模块版本ID(guid)(为了区分构建),另一个类似的问题是:我可以在构建时指定模块版本ID(MVID) .net汇编?
上面链接的问题似乎表明没有办法重建一个项目,并且二进制文件与之前构建的相同的未更改的代码相匹配..好吧,很好,我理解 - 但为什么所有的二进制文件都被重建了?
我认为,根据文档(http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx),除非将-c指定为参数,否则aspnet_compiler应该只重建那些实际需要的二进制文件(由于代码更改).我是误解还是遗漏了什么?
我正在使用的aspnet_compiler参数:
aspnet_compiler -f -u -fixednames -nologo -v / -p .\myproject\ .\mybuild\
Run Code Online (Sandbox Code Playgroud)
请注意,只有WebSite项目才会出现此问题,而不是Web应用程序项目(它们的编译方式不同).即使您创建一个没有功能的WebSite项目和页面,也不会打开它或在构建之间以任何方式更改它,也会出现此问题.
反编译生成的二进制文件显示没有差异.比较两个"相同"构建的二进制文件,每次在同一部分的二进制文件中显示出小的差异 - 我认为这可能与随机构建guid有关.我发现在构建之间没有办法避免这种变化.
将.NET源代码(c#或vb)编译为.exe文件时会发生什么?我希望了解在制作exe文件时发生的过程,并查看了有关逆向工程和反编译的几个问题(例如,如何将.NET EXE反编译为可读的C#源代码?以及当用户单击.NET程序集时会发生什么?(EXE)?)
提前致谢
这个问题基于前一个问题:C#编译如何解决需要头文件的问题?.
确认C#编译使用多个通道基本上回答了我原来的问题.此外,答案表明C#使用存储在程序集中的类型和方法签名元数据来在编译时检查代码语法.
问: C/C++/Objective-C如何知道在编译时链接的运行时加载哪些代码?并将其与我熟悉的技术联系起来,C#/ CLR如何做到这一点?
如果我错了,请纠正我,但对于C#/ CLR,我的直观理解是在执行时检查某些路径的程序集,并且基本上所有代码都在运行时动态加载和链接.
编辑:更新为包含C++和Objective-C with C.
更新:为了澄清,我真正感到好奇的是C/C++/Objective-C编译如何匹配源代码中的"外部定义"符号与该代码的实际实现,编译输出是什么,以及编译的基本方式输出由微处理器执行,以将控制无缝地传递到库代码中(就指令指针而言).我已经使用CLR虚拟机完成了这项工作,但我很想知道在实际的微处理器上如何在C++/Objective-C中概念性地工作.