微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

加载 .Net Core x64 exe 作为 .Net 程序集并启动进程 C#

如何解决加载 .Net Core x64 exe 作为 .Net 程序集并启动进程 C#

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

我现在使用的是:

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.'

解决方法

但问题是,它只适用于 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");

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。