【问题标题】:Embedded a *.exe into a dll将 *.exe 嵌入到 dll 中
【发布时间】:2009-02-24 00:57:27
【问题描述】:

有人知道如何将 exe 文件嵌入到 dll 中吗?

我有一个工具,它是我从 c# 代码调用的 exe 文件。

问题是我想要 1 个包含此工具(exe 文件)的 dll 和包含我的 c# 代码的 dll。

是否可以在资源中嵌入这个 exe 文件?

提前谢谢

【问题讨论】:

  • 我删除了“嵌入式”标签,因为这个问题与嵌入式系统并不真正相关。

标签: c# dll exe


【解决方案1】:

确实如此。您可以在应用程序中将任何文件添加为 RC_DATA 作为资源。但我相信你需要先把它解压到磁盘才能调用它!

您使用的是哪种 IDE/语言?

[编辑]

对不起!你确实提到你正在使用 C#。

  1. 向您的应用程序添加资源文件(在 IDE 中右键单击应用程序并选择“添加新项目”。
  2. 使用资源编辑器中的工具栏添加现有文件。
  3. 然后在需要时通过调用类似以下的代码来提取 exe: System.IO.File.WriteAllBytes (@"C:\MyEXE\", Resource1.MyEXE);

【讨论】:

  • 规则是这样的,除了你可以从一个字节[]加载一个程序集,所以不需要创建文件。
  • 谢谢你的回答所以最后,我需要将它写在文件系统上才能执行它吗?不这样做就不可能执行它?
  • 如果它是一个.Net EXE,那么它可以作为一个程序集加载。否则,没有。单独提取和运行是您唯一可以做的事情。
  • 什么是`Resource1.MyEXE`,你能解释一下它为什么起作用吗?
【解决方案2】:

值得一提的是,您的用户可能对您这样做不太满意。将他们无法控制的可执行文件嵌入到您将提取并运行的 DLL 中可能会让人们担心在他们的机器上运行木马。

最好将 .EXE 留在文件系统中,并对应用程序的操作保持透明。

【讨论】:

  • 这不是一个真正有效的问题。如果用户正在运行我的 DLL,他们显然信任我。此外,您是否查看过您使用的应用程序启动的所有帮助程序可执行文件?
【解决方案3】:

您可以从 byte[] 加载程序集。这可以通过嵌入资源的 ManifestResourceStream 获得。

【讨论】:

    【解决方案4】:

    另一种方法可能是不嵌入 .exe 本身,而是将其功能包含在 dll 中,并使用 rundll32[1] 来执行它。

    【讨论】:

    【解决方案5】:

    附带说明,请记住,当您将文件从资源中提取到磁盘然后在其上执行代码时,您可能会触发 Windows Data Execution Prevention - 基本上,Windows 会尝试自动检测某些内容是否应该是代码或数据,如果它看起来像数据(资源会这样),那么它将阻止该数据作为代码执行。

    如果要通过网络而不是本地驱动器使用 .NET 程序集,这将成为一个特别棘手的问题 - 有各种 .NET 安全配置可能会阻止它正常工作。

    另一种选择,不知道你的项目的细节,带着一粒盐:在你的安装中添加一个 .exe.readme 文件,向任何好奇的用户或 IT 人员描述为什么他们没有可执行文件' t期望在安装目录中:)

    【讨论】:

    • 这是对 DEP 的一个……有趣的混淆描述。不,DEP 真的不会神奇地将磁盘上的可执行文件标记为来自资源分支,因此不可执行。不,DEP 不会“尝试”“检测”任何东西。相反,它是一种将内存页面标记为可执行或不可执行的机制。
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2011-10-18
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多