【问题标题】:VB.NET Resource exe in memory with argument带有参数的内存中的 VB.NET 资源 exe
【发布时间】:2021-01-09 02:09:38
【问题描述】:

好吧,所以我对内存执行中的任何事情都很陌生。我通常只是将嵌入资源中的字节写入硬盘驱动器上的文件,但对于我为工作项目制作的程序,它无法将 exe 写入磁盘。

所以我从Load a .NET assembly from the application's resources and run It from memory, but without terminating the main/host application 获取了代码 我稍微修改了代码,我认为可以使用参数运行它,它除了崩溃之外什么都不做,除了 Windows 错误报告之外,并没有真正列出任何崩溃细节。 这是代码:

 Dim ass As Assembly = Assembly.Load(My.Resources.bbinst)
            Dim method As MethodInfo = ass.EntryPoint
            Dim parametersArray As Object() = New Object() {"/q /SERIAL=xxx-xxx"}

            If (method IsNot Nothing) Then
                Dim instance As Object = ass.CreateInstance(method.Name)
                method.Invoke(instance, parametersArray)
                If (instance IsNot Nothing) AndAlso (instance.GetType().GetInterfaces.Contains(GetType(IDisposable))) Then
                    DirectCast(instance, IDisposable).Dispose()
                End If
                instance = Nothing
                method = Nothing
                ass = Nothing

            Else
                Throw New EntryPointNotFoundException("Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?")
            End If

bbinst 是嵌入为 bbinst.exe 的 exe 名称 parametersArray 是我想要运行的参数,它是从我在其他地方找到的 C# 示例转换而来的。

谁能帮我解释一下为什么程序会崩溃,然后第二次弹出错误报告,我不擅长调试。我也尝试在没有参数的情况下运行它,它也以同样的方式崩溃。

任何帮助都很棒,有时我在工作中有这些随机项目我不知道他们为什么给我哈哈

【问题讨论】:

  • 哪个程序崩溃了?主机还是嵌入式?如果是前者,请从 Visual Studio 启动您的应用程序,以便附加其调试器。
  • 我不确定,它不会只给出 Windows 错误报告的 .net 运行时错误。当我关闭错误窗口时,它会关闭整个程序。我不知道这是否有帮助,但在进程资源管理器/进程黑客中,它没有显示第二个 exe 正在加载/启动。我将不得不在几个小时内重做程序上的代码以将其附加到 Visual Studio 调试器。
  • 为什么你必须重做代码才能通过VS运行它?如果你在那里编码,你应该只需要打开项目并按 F5。 -- 此外,即使错误对话框提供的信息不是很丰富,您仍然可以检查 Windows 事件查看器 (eventvwr.msc) 以了解更具体的错误。查找包含 Application Error.NET Runtime Error 的项目。
  • 因为它在底部是一个大的代码列表,它在执行此步骤之前执行。我只是将它注释掉并在 VS 中运行它,我知道为什么我什至忘记了查看器,我明天会检查它。
  • 先创建一个新项目并在那里尝试如何?这样您就可以查看代码是否有效,或者它是否与您的特定项目相关。

标签: vb.net memory resources arguments


【解决方案1】:

当您尝试加载错误位数的程序集,或者当您尝试加载当前运行时无法读取、运行或编译的程序集时,将引发 BadImageFormatException

关于位数: 32 位 (x86) 应用程序无法加载 64 位代码,64 位 (x64) 应用程序无法加载 32 位代码。就这么简单。

至于无法读取、运行或编译程序集:如果您尝试加载的程序集是用完全不同的语言编写的(更准确地说:没有 .NET 的语言support) 那么也会导致上面的异常被抛出。

您执行嵌入式应用程序的方法仅适用于以 .NET 语言(C#、VB.NET、F#、C++/CLR 等)编码的程序集。这是因为它不仅运行应用程序,它还尝试像链接到 Assembly 和/或 AppDomain 类的 .NET 应用程序一样加载它,以便您可以对其进行一些控制并调用其中的方法它。

您的问题:我敢打赌,您的问题是由您的嵌入式应用程序与主机的位数不同引起的。确保两个应用程序编译为x86x64AnyCPU

但是,如果事实证明您的嵌入式程序甚至不是用 .NET 语言编写的,那么这就是您的问题的原因。您的代码只能运行 .NET 程序/DLL。

【讨论】:

  • 嗯,我正在加载的程序显然是 x86 和 x64 并且我正在编码的程序选择了任何 CPU 平台,我应该尝试仅作为 x86 运行吗?
  • 我将平台更改为 x86 并收到相同的错误,但在 .net 运行时错误中而不是在事件查看器中(在 VS 调试器中也出现相同错误)编辑/更新:我尝试了 x86 和 x64平台,在 VS 调试器中每次都出现同样的错误
  • @Paintballer4lfe : 主程序(您正在编码的程序)必须以与您的平台完全相同平台(位数)为目标重新加载。因此,如果您正在编写代码 以x86 为目标,那么您正在加载的 也必须以x86 为目标。 -- 同样,如果您正在编写代码 的目标是AnyCPU,那么您正在加载的 也必须以AnyCPU 为目标。 (等等)
  • @Paintballer4lfe :顺便说一下,您正在加载的程序(嵌入式程序),使用什么编程语言 写了吗?程序是你写的吗?
  • @Paintballer4lfe :我用另一个可能的问题原因更新了我的答案。我没想到会是这样,因为我假设您的嵌入式程序是用 .NET 语言编写的,但如果不是这样,那么我在答案中添加的内容就是您的问题的实际原因。
【解决方案2】:

您可以通过在程序集中加载入口点来调用它:

 Public Shared Sub RunSearch(ByVal pPath As String, ByVal pText As String)
    'Get assembly
    Dim assembly As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()

    'Get the resource stream
    Dim resourceStream As Stream = assembly.GetManifestResourceStream("path.executable name")

    If resourceStream Is Nothing Then
         MsgBox("Unexisting Path","Error")
    End If

    'Read the raw bytes of the resource
    Dim resourcesBuffer(CInt(resourceStream.Length) - 1) As Byte

    resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length)
    resourceStream.Close()

    'Load the assembly
    Dim exeAssembly As Reflection.Assembly = Reflection.Assembly.Load(resourcesBuffer)
    Dim args() As String = {pPath, pText}
    Dim parameters = New Object() {args}
    Try
        exeAssembly.EntryPoint.Invoke(Nothing, parameters)
    Catch
        MsgBox("Error during assembly executing","Error")
    End Try
End Sub

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2014-07-25
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多