从内存流中执行程序

3

如何执行存储在MemoryStream中的程序,以便无需先保存到硬盘。文件不得临时保存到硬盘。该程序必须完全从内存中运行。

        static   string strTemplate = "MyAPP.SOMEprogram.exe";
        byte[] template;
        int len = 0;

        Assembly assembly = Assembly.GetExecutingAssembly();
        using (Stream stream = assembly.GetManifestResourceStream(strTemplate))
        {

            len = (int)stream.Length;
            BinaryReader reader = new BinaryReader(stream);
            template = reader.ReadBytes(len);


        }

        MemoryStream ms = new MemoryStream(template, true);

现在所有的程序都在内存流(RAM)中运行,我能执行这个程序吗?非常感谢。

1
我猜你不是在说仅仅加载一个托管程序集,对吧? - Daniel Brückner
3个回答

2

我想不出一个明显的方法来做到这一点。我能想到的最接近的方法是使用RAM磁盘 - 你将没有硬盘访问权限(除了可能的分页),但这仍然与你所要求的非常不同。

需要注意的是,我所说的是运行任意程序,而不是加载托管程序集。


1
您需要安装驱动程序,调用驱动程序API来创建新的RAM磁盘,然后就可以像使用普通驱动器一样使用它-将程序编写到RAM磁盘上的文件中并执行它。http://www.mydigitallife.info/2007/05/27/free-ramdisk-for-windows-vista-xp-2000-and-2003-server/列出了几个RAM磁盘驱动程序,其中一些带有源代码,但如何安装驱动程序并与之交互可能会严重依赖于您选择的驱动程序。您应该开始阅读文档和源代码(如果可用),然后看看如何继续操作。 - Daniel Brückner
谢谢,但问题在于我不希望用户看到程序执行的位置,我想要复制保护,这里的RAM磁盘可以帮助吗? - Armen Khachatryan
不(容易)是因为用户也可以看到RAM盘。但是对于用户从资源文件中提取程序来说相当容易。 - Daniel Brückner

1

您可以尝试使用Assembly.Load(byte[]),但您可能需要解决代码访问权限的问题,而且某些杀毒软件也可能不允许您这样做。


是的,你说得对,Assembly.Load(byte[])方法只能在该byte[]数组中包含.NET程序时才能正常工作,否则无法正常工作,我说得对吗? - Armen Khachatryan
2
是的,你说得对。如果你想在.NET应用程序中嵌入本地应用程序资源,请更新你的问题来提及这一点。 - Sandeep Datta

1
关键在于从字节数组中查看构建/加载一个程序集到内存中。一旦您获得了对程序集的引用,就可以轻松地访问其类型并实例化它们。一旦您获得了类型实例,请调用其中的方法来“运行”您的程序。

Assembly..::.Load 方法(array<Byte>[])这个方法适用于使用 C++ 编写的程序,而不是 C# 吗?谢谢。 - Armen Khachatryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接