【问题标题】:Load .NET Core x64 exe as .NET assembly and start process [duplicate]将.Net Core x64 exe加载为.Net程序集并启动进程C# [重复]
【发布时间】:2021-09-27 15:52:34
【问题描述】:

我需要将一个可执行文件转换为字节,然后用它启动一个进程。

我现在使用的是这样的:

using System.Reflection;
using System.Threading;

public static class MemoryUtils
{
    public static Thread RunFromMemory(byte[] bytes)
    {
        var thread = new Thread(new ThreadStart(() =>
        {
            var assembly = Assembly.Load(bytes);
            MethodInfo method = assembly.EntryPoint;
            if (method != null)
            {
                method.Invoke(null, null);
            }
        }));

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        return thread;
    }
}

实施:

var bytes = File.ReadAllBytes(@"C:\myexecutable.exe");
MemoryUtils.RunFromMemory(bytes).Join();

但问题是,它只适用于 32 位的可执行文件,而可执行文件是 64 位的。知道我该怎么做,有什么建议吗?谢谢

我得到的错误:

System.BadImageFormatException: 'Bad IL format.'

【问题讨论】:

  • 我确信我以前对 64 位程序集做过类似的事情。您的主机程序 - 它是用 x86、x64 还是 AnyCpu 编译的?也许尝试明确构建为 x64,看看是否有帮助?
  • “它只适用于 32 位进程,可执行文件是 64 位” - 不清楚你的意思。您发布的代码适用于 x64。请更具体。请注意,您加载的文件需要是有效的托管程序集;对于 .NET Core,这通常意味着已编译的 .dll,因为 .exe 只是加载代码的引导程序。
  • @nexxus - 请显示错误消息。 @Ozzah - 我刚刚尝试了在 Visual Studio 中加载默认控制台应用程序的 OP 代码,该应用程序只是将“Hello World”打印为要加载的程序集。使用目标 AnyCPU、x86 和 x64 都抛出了System.BadImageFormatException: 'Bad IL format.' 也许有一些额外的技巧来生成可接受的 COFF exe?
  • @dmedine:正如我在评论中指出的,如果您编译 .NET Core 程序,则需要加载生成的 .dll,而不是 .exe。 .exe 只是加载托管程序集的东西;它本身不是托管程序集,不能与Assembly.Load() 一起使用。如果您使用单文件/自包含编译选项之一,则 .exe 也是如此。只有 .NET Core 的“可移植”选项有效,即便如此,也只有加载 .exe 有效。
  • @PeterDuniho- 我没有看到你的评论。以这种方式加载 exe 对我来说确实很奇怪。

标签: c# process executable


【解决方案1】:

但问题是,它只适用于 32 位进程,而可执行文件是 64 位的。任何想法我该怎么做,有什么建议吗?

目前尚不清楚您遇到了什么错误,或者您所说的“仅适用于 32 位进程”是什么意思。但是,我怀疑您正在尝试加载错误的文件。

不可移植的 .NET Core .exe 不是有效的托管程序集。如果您希望能够使用 Assembly.Load() 加载您的 .NET Core 程序,您必须将其编译为可移植程序集,并且您必须加载生成的 .dll 文件,而不是 .exe (后者只是知道如何运行 .dll 的小存根)。

所以,你需要:

  1. 确保将myexecutable.csproj 编译/发布为可移植程序集,并且
  2. 确保您加载的是myexecutable.dll,而不是myexecutable.exe(即var bytes = File.ReadAllBytes(@"C:\myexecutable.dll");

请参阅Build .NET Core console application to output an EXE,了解有关编译 .NET Core 程序的各种方法的更多详细信息。

【讨论】:

  • 我可以在我的代码中创建 .exe 的 dll 还是需要重新编译?可执行文件不是我的,但我会寻找源代码
  • "我可以在我的代码中创建一个 .exe 的 dll" -- 如果它不是一个正确的 IL 程序集,那么你无法执行任何操作作为您现有流程的一部分。是否有某些特殊原因您不会/不能将 .exe 作为外部进程运行(即使用System.Diagnostics.Process)?
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多