将B.exe导入A.exe然后从A.exe运行B.exe

时间:2011-04-11 18:28:55

标签: vb.net

我正在使用Visual Basic 2008,我对此有疑问?

我有a.exeb.exea.exevbAppb.exe是可执行文件)。是否可以将b.exe包含到a.exe中,然后从a.exe运行它?例如,将b.exe导入vbProject,然后在不提取的情况下运行它。

2 个答案:

答案 0 :(得分:0)

问题有点模糊,但你可以用几种不同的方式做这些事情。

首先,您当然可以将单独的EXE(我将其称为EXEA)编译为VB项目(将其称为EXEB)。当用户运行EXEB时,它会提取包含EXEA的资源,将其保存为文件(可能是临时文件夹或具有WRITE权限的某个地方),然后将其保存到EXEA。

另一种可能性是将外部功能编译成DLL,称之为DLLA,然后将该DLL编译成VB项目(称之为EXEB)。

当用户运行EXEB时,它会提取包含DLLA的资源,将其存储为内存流,然后使用ASSEMBLY.LOAD从内存流(而不是从文件)加载DLL,此时可以创建对象从那个dll,并正常使用它。

在这两种情况下,最好只编译第二个EXE或DLL,并将它们都包含在MSI安装项目中。

问题中的更多细节可能有助于缩小其他可能的解决方案。

答案 1 :(得分:0)

试试这个:
1)B.exe。的开放项目 2)在项目B中创建一个新模块,添加“Sub Main”,然后写入此 Sub Main(Byval args() As String)
Dim X As New Form1 'replace Form1" with your real startup form
X.ShowDialog
End Sub

3)打开该项目B的属性,并取消选中名称为“启用应用程序框架”的复选框。并将“启动对象”更改为“子主” 4)编译并关闭项目B.
5)现在打开A.exe的项目,并使用以下代码在内存中运行B.exe:
Dim tmpAssembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes("C:\b.exe"))'Replace "C:\b.exe" real b.exe path
Dim TmpMethod As MethodInfo = tmpAssembly.EntryPoint
If TmpMethod IsNot Nothing Then
Dim TmpObject As Object = tmpAssembly.CreateInstance(TmpMethod.Name)
Dim args() As String = Nothing
TmpMethod.Invoke(TmpObject , args)
End If
Me.Close()

小心!只有在对这些应用程序执行了步骤1和步骤2时,才能在内存上运行应用程序。否则你会得到错误,但还没有解决......