【问题标题】:How to run c++ binary code from c# application如何从 c# 应用程序运行 c++ 二进制代码
【发布时间】:2017-02-17 12:40:59
【问题描述】:

我有一个来自可以工作的 c++ 应用程序的二进制数据。我想直接从我的 C# 应用程序运行特定的二进制代码。

我有这个从网上得到的功能:

    static void MemExe(byte[] buffer)
    {
        Assembly asm = Assembly.Load(buffer);

        if (asm.EntryPoint == null)
            throw new ApplicationException("No entry point found!");

        MethodInfo ePoint = asm.EntryPoint;
        object ins = asm.CreateInstance(ePoint.Name);
        ePoint.Invoke(ins, null);
    }

它适用于 C# 二进制代码,但如果我尝试打开 C++ 二进制代码,它会崩溃。

这里的例外:

附加信息:无法加载文件或程序集“加载了 5154816 字节的测试,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null”或其依赖项之一。试图加载格式不正确的程序。

我猜这与标题有关?我不是专家...

是否可以像 MemEx 函数一样运行 c++ 二进制文件 运行 C# 二进制文件?

谢谢。

【问题讨论】:

  • assembly.Load() 方法或其重载无法加载非托管库(例如 C/C++ dll)。您需要使用 C# 的 interoperability 功能(例如DllImportAttribtute)。 Google for C/C++ interoprability/pinvoke 了解更多信息。
  • 这个question 可能会有所帮助。
  • @f.nasim 谢谢。但在那个问题中,我认为用户正在尝试执行 dll 本身内部的函数。我不想要那个。我有一个用 C++ 编写的完整应用程序,我想直接运行它的二进制代码。
  • @f.nasim 而且,我需要在运行 C++ 应用程序之前对其进行解密。
  • @MichalHainc 但我不想创建任何文件来运行它。我想从内存中运行它或在其他进程中注入代码。

标签: c# c++ binary


【解决方案1】:

Assembly.Load(...) 只会加载 .NET 二进制文件。

如果您想访问 .NET 以外的二进制 API,则需要使用 P/Invoke 签名。

如果要运行可执行文件,请使用System.Diagnostics.Process.Start(...)

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多