我正在尝试在内存上运行应用,但我在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() {})
谢谢大家的支持!
答案 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