vb.net在内存中运行exe

时间:2015-07-25 23:05:55

标签: vb.net memory

我正在尝试在内存上运行应用,但我在Invoke时遇到错误。我做错了什么?

我正在尝试这样做但是在vb.net中

代码C#

 // read the bytes from the application exe file
  FileStream fs = new FileStream(filePath, FileMode.Open);
  BinaryReader br = new BinaryReader(fs);
  byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
  fs.Close();
  br.Close(); 


// load the bytes into Assembly
Assembly a = Assembly.Load(bin);
// search for the Entry Point
MethodInfo method = a.EntryPoint;
if (method != null)
{
    // create an istance of the Startup form Main method
    object o = a.CreateInstance(method.Name);
    // invoke the application starting point
    method.Invoke(o, null);
}

in vb:

Dim instance As FileStream = File.Open("teste.exe", FileMode.Open)
Dim br As New BinaryReader(instance)
Dim bin As Byte() = br.ReadBytes(Convert.ToInt32(instance.Length))
instance.Close()
br.Close()
Dim a As Assembly = Assembly.Load(bin)
Dim metodo As MethodInfo = a.EntryPoint
If (IsDBNull(metodo) = False) Then
    'create an istance of the Startup form Main method
    Dim o As Object = a.CreateInstance(metodo.Name)
    'invoke the application starting point
    metodo.Invoke(o, Nothing)
Else
    MessageBox.Show("Nao encontrado")
End If

更新:

我找到了答案。我创建了“test.exe”,就像ConsoleAplication一样,而不是模块I代码

Imports System.Windows.Forms
Module Module1
    Sub Main()
        Dim Form1 As New Form1
        Form1.Show()
        Do Until Form1.Visible = False
            Application.DoEvents()
        Loop
    End Sub
End Module

然后我从ConsoleApplication更改为Windowsform并创建我的Form1。这个

metodo.Invoke(o, Nothing)

到此:

metodo.Invoke(Nothing, New Object() {})

谢谢大家的支持!

2 个答案:

答案 0 :(得分:1)

Main方法希望您将args参数传递给它。您当前的通话没有传递任何参数,因此我预计如果它到达该行,您将收到以下错误:

  

System.Reflection.TargetParameterCountException:参数计数不匹配。

要修复它,只需传递一个单元素的对象数组作为method.Invoke的第二个参数。此外,由于Main方法是静态方法,因此在调用方法之前,您不需要执行CreateInstance

所以你需要的就是:

metodo.Invoke(Nothing, New Object() {Nothing})

如果由于某种原因,您确实需要将值传递给主args参数,则可以这样做:

metodo.Invoke(Nothing, New Object() {New String() {"param1", "param2"}})

答案 1 :(得分:0)

假设c#代码有效,你错误地翻译了空检查。

vb.net中的'if(method!= null)'等价于

If method IsNot Nothing Then
    Dim o = a.CreateInstance(method.Name)
    method.Invoke(o, Nothing)
End If