在.Net中,我想枚举所有AppDomain上的所有加载的程序集。 为我的程序的AppDomain做它很容易AppDomain.CurrentDomain.GetAssemblies() 。 我需要以某种方式访问每个AppDomain? 还是有一个工具,这样做?
在32位,我们有8个“通用”寄存器。 与64位,金额翻倍,但它似乎独立于64位变化本身。 现在,如果寄存器速度如此之快(没有内存访问),为什么自然不会有更多? CPU制造商不应该将尽可能多的寄存器工作到CPU中吗? 为什么我们只有我们拥有的金额有什么逻辑限制?
哪个值更好用? 布尔真或整数1? 上面的话题让我在if条件下用bool和int做了一些实验。 所以出于好奇,我写了这个程序: int f(int i) { if ( i ) return 99; //if(int) else return -99; } int g(bool b) { if ( b ) return 99; //if(bool) else return -99; } int main(){} g++ intbool.cpp -S为每个函数生成asm代码,如下所示: asm代码f(int) __Z1fi: LFB0: pushl %ebp LCFI0: movl %esp, %ebp LCFI1: cmpl $0, 8(%ebp) je L2 movl […]
汇编器中EDI和ESI寄存器的实际用途和用途是什么? 我知道他们用于string操作的一件事情。 有人也可以举个例子吗?
我想加载到一个新的AppDomain一些程序集,其中有一个复杂的引用树(MyDll.dll – > Microsoft.Office.Interop.Excel.dll – > Microsoft.Vbe.Interop.dll – > Office.dll – > stdole.dll ) 据我所知,当一个程序集加载到AppDomain ,它的引用不会自动加载,我必须手动加载它们。 所以当我这样做时: string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory string path = System.IO.Path.Combine(dir, "MyDll.dll"); AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup); domain.Load(AssemblyName.GetAssemblyName(path)); 并得到FileNotFoundException : 无法加载文件或程序集'MyDll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。 该系统找不到指定的文件。 我认为关键是它的一个依赖 […]
在我继续之前,请注意,这是一个相当长的关于Windows命令提示符的infosec通知,因为我发现了一个可能被使用简单的batch file利用的bug。 这个bug在2000以后的所有Windows版本中都很普遍,在64位和32位机器上都能正常运行,而且这是一个batch fileparsing错误,它不需要额外的软件来安装( cmd.exe是Windows的缺省部分)并且可以由任何具有任何级别的特权的用户启动(假设他们可以运行cmd.exe并因此parsingbatch file)。 在这个总结中包含了错误发生的地方(用代码stream来分析原因)。 这不是一个RCE级的bug(不是我已经能够find的),只是一个DoStypes,并且需要用户运行它(或者把它作为启动项),但是考虑到它的简单性和Windows系统无处不在,我觉得值得再看一下。 请注意,如果您运行任何这些启用batch file的bug并导致系统崩溃(任务pipe理器并在运行失控脚本的情况下终止PID),则我不承担任何责任。 tldr :只有这行^ nul<^的batch file会导致大量的内存泄漏,而只有这一行的batch file会导致命令提示符因“无限recursion”而崩溃。 这些行为可能导致在任何Windows系统(Win2k +)上发生有趣的批量“黑客攻击”,原因是cmd.exebatch file处理中存在逻辑错误(请参阅下面的汇编和伪C代码以获取更多信息)。 背景 在回答关于超级用户( 链接 )的问题时,我遇到了一个有趣的exception情况:命令解释器如何parsingbatch file。 如果脱字符( ^ )是该文件的最后一个字符,则可能会发生内存泄漏/ cmd.exe崩溃。 脱字符必须是文件的最后一个字符,不能跟着\n (换行字符),尽pipe\r (回车符)是正确的,因为在脱字符被parsing之前它已被删除; 没有任何东西可以跟踪它,因为它会导致parsing器正常进行(因为^\r\t会变成“ ^\t因此\t被“忽略”)。 关于回车字符的最后一个注意事项,这个错误仍然发生,这实际上使它更有趣一些,因为它在大多数文本编辑器中“伪造”了一个换行符,而在记事本中,你可能会被愚弄到认为最后有一个换行符'技术上'这是一个回车或'旧的Mac'新线)。 在做了一些快速的调查之后,我发现文件末尾的^可能会导致内存泄漏或者可能导致命令提示符崩溃(更具体地说是command.com或cmd.exe程序),我还发现特定的batch file及其序列)可以导致一些非常有趣的行为。 进一步的调查使我向其他人提出类似的问题。 一个Stack Overflow问题,用户在ss64.com上发现了一个内存泄漏和一个留言板话题,这个话题logging了EOF插入符其他有趣的行为 。 堆栈溢出问题有助于确认暂停,这是一个无限循环types的情况,但没有试图潜水比这更深。 ss64.org主题大多讨论了各种使命令提示符崩溃的方法,但未能解释它是什么样的崩溃或原因。 这当然会让我质疑发生了什么,为什么(可以被利用)。 答案是混合的,修复很简单(至less从我正在检查的程序集看起来是“简单的”)。 我发现可以产生内存泄漏的batch file技巧的几种组合,多快或多慢取决于batch file中的内容(而不是多less插入符号,但pipe道顺序和有趣的行长度[稍后])并且无论崩溃或内存泄漏,parsing器代码在单个线程中处于紧密的循环中,因此CPU使用率显着增加(单核CPU或推送到单个关联,平均产生98%以上的CPU使用率)。 崩溃 要使命令提示符崩溃非常简单,没有换行符的batch file只包含以下字符^&^ (或^|^ ),将导致批处理命令提示符崩溃,错误代码为0xC00000FD ,这是由于无限recursion导致的堆栈/帧溢出。 这证实了'无限循环'的情况,但没有完全解释内存泄漏(或为什么因为无限的recursion而崩溃)。 在这个意义上,我开始研究一些最简单的产生内存泄漏的方法。 事实certificate,一个2字节的batch […]
我是.NET C#编程的新手。 我正在跟着几本书。 有人说,而不是直接编译为二进制代码(本机代码)。 高级代码被转换成中间语言(称为MSIL又名CIL)。 但是当我编译时,我得到一个exe / Dll文件。 这个MSIL / CIL包含在这些EXE / DLL文件? 我想看看中间语言代码。 只是为了感受它的存在。 如何查看? 他们正在调用这个exe / dll文件一个assembly 。 他们是否使用这个“花哨的词”只是为了区分这些从包含二进制代码(本地代码)的exe / dll文件?
在.NET BCL中有以下几种循环引用: System.dll和System.Xml.dll System.dll和System.Configuration.dll System.Xml.dll和System.Configuration.dll 下面是.NET Reflector的截图,显示了我的意思: 微软如何创build这些程序集对我来说是个谜。 是否需要一个特殊的编译过程? 我想象一些有趣的事情在这里发生。
这可能是徒劳的,因为我知道编写一个操作系统是非常复杂的(尤其是自己)。 我不期望构build下一个Linux或Windows。 我知道这将是可怕的,越野车,并将无法正常工作,但没关系。 我想自己写一切,在大会 , C ,和(一些) C + + 。 这是一个未来的项目,因为我现在正在忙于其他一些事情,并没有立即有时间,但我想我现在会问,所以也许我可以得到很多答案,它可以build立并成为这种方法的一个有用的资源(我所看到的其他一切都涉及到使用minix,使用现有的引导程序,在虚拟引导程序中构build它等)。 我想用显示器,键盘和鼠标设置我的旧桌面之一,并开始在一个空白的硬盘驱动器上工作。 我想学习如何编写自己的bootloader(我已经find了很多关于这方面的资源,但为了完整性,请添加一些好的资源),我自己的USB驱动程序(如果有必要的话),CD驱动程序(如果这是必要的)等一切,从头开始。 如何将代码放到电脑上? 最好用软盘来做吗? 大多数计算机是否可以通过USB棒进行操作? 我需要什么样的驱动程序?你能提出一些build议吗? 启动序列后 – 那么是什么? 如何进入保护模式等 如何在没有操作系统的帮助下pipe理内存? 我只是使用任何我想要的地址? 不需要初始化? 我无疑会遇到什么会迷惑我吗? 我怎样才能使它不是一个命令行O / S,而是一个graphics? 什么是build立在graphics操作系统上? 比如,我该如何做一些事情,如命令行,字体和顶部的图片? 我在哪里可以阅读有关设置多任务环境? (即,有两个graphics式的命令行并排运行)。 我将如何build立一种窗口系统? 一旦设置简单的多任务处理,如何在屏幕上显示graphics? 相信我,我明白这是一个非常复杂的项目,我可能永远不会完成它或任何使用它写任何东西。 还有很多其他的东西,我没有提到,如果你想到的话,也可以随意添加。 请为每个答案放上一个“主题”,例如,USB驱动程序,然后可能是资源列表,要注意的东西等等。 此外,请不要build议build立另一个操作系统或预先存在的代码。 我知道我会读很多预先存在的代码(比如linux内核,示例资源,现有的驱动程序等等),但是最终我想自己写所有的代码。 我知道我应该从别的东西上来,而且还有很多其他的问题,如果我改变主意,走上这条路,我就能读懂。 但是这一切都是关于从头开始整个事情。 更新 我有很多很好的答案,主要是关于引导过程,文件系统和各种现有的项目,以供参考。 有关如何获得graphics的任何build议? 不同的video模式,以及如何与他们合作等?
我在ASP.NET应用程序中有一个“诊断”页面,它可以执行诸如validation数据库连接,显示当前的appSettings和ConnectionStrings等。此页面的一部分显示了整个使用的重要types的程序集版本,但我想不出如何有效地显示所有加载的程序集的版本。 在.NET应用程序中找出所有当前引用和/或加载的程序集的最有效方法是什么? 注意:我对基于文件的方法不感兴趣,例如在特定目录中遍历* .dll。 我感兴趣的是现在应用程序正在使用什么。