在 C# 沙箱中运行非托管 EXE

Posted

技术标签:

【中文标题】在 C# 沙箱中运行非托管 EXE【英文标题】:Running unmanaged EXE in C# sandbox 【发布时间】:2012-12-04 03:37:27 【问题描述】:

我的应用程序中有一个第三方非托管程序。我还有一个托管 C# 应用程序,它是系统的“入口点”。保证非托管程序只有在满足一定条件的情况下才能正常运行。

我想让 C# 应用程序在沙盒中运行非托管程序,这样特定文件就不会直接从硬盘读取或写入硬盘;相反,C# 应用程序需要对其进行处理,然后将文件提供给 3rd 方应用程序或将其保存到磁盘。

我研究过使用 C# 的 AppDomain 类,但我相信它只能运行托管代码。对于我想要完成的工作,是否有替代系统?

【问题讨论】:

您需要一个虚拟机管理程序/VM。一旦启动,C# 就无法控制 .EXE。 这种功能需要操作系统挂钩/扩展,并且会花费很多时间;你也可能无法在 C# 中做到这一点。 【参考方案1】:

很确定您不能真正在 C# 沙箱中运行非托管程序,除非在 C# 中编写非托管仿真器并在其中运行非托管可执行文件。而且它运行起来很慢而且很难写,所以你可能不想走那条路。

我能看到这个工作的唯一方法是,如果非托管程序为文件系统调用 C# 包装器。你有非托管程序的源代码吗?

【讨论】:

我确实有它的源代码,但构建设置相当不稳定,我不确定管理代码是否实用。它确实使用 Visual Studio 2008 (C++) 构建,但我不确定向 makefile 添加一些额外的编译器指令是否是一件简单的事情。 @FranklinBarnett - 这将是一个单独的问题,涉及您发布相关代码。如果你不知道如何做沙盒,为什么要尝试做沙盒? @Ramhound 沙箱是我在这里看到的唯一真正的选择。问题不在于如何制作沙箱,而在于预先构建的 C# AppDomain“沙箱”是否可以沙箱非托管代码。因为答案是否定的(根据这个答案),我可能需要弄清楚如何让其他程序编译为托管代码。 @FranklinBarnett - 只是不确定您此时担心沙盒的原因。没有它完全可以编写安全的非托管代码。让操作系统来处理这一切。 @Ramhound 沙盒的原因是某个非托管应用程序读取/写入的文件在被该程序读取或写入硬盘驱动器之前通过我的程序进行处理。使用 C# 似乎无法使用该方法。

以上是关于在 C# 沙箱中运行非托管 EXE的主要内容,如果未能解决你的问题,请参考以下文章

使用非托管 C++ .dll 从 C# .exe 调用函数

C# Windows 窗体无法在 Windows10 上加载非托管 C++ DLL

使用 exe 编译非托管 DLL

从 C# 线程内的非托管 dll 运行函数

C#:捕获混合托管/非托管进程的所有错误/异常

从托管 C# 代码调用非托管 C++ 代码以生成脱机域加入 blob