我正在使用Visual Basic 2008
,我对此有疑问?
我有a.exe
和b.exe
(a.exe
是vbApp
,b.exe
是可执行文件)。是否可以将b.exe
包含到a.exe
中,然后从a.exe
运行它?例如,将b.exe
导入vbProject
,然后在不提取的情况下运行它。
答案 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时,才能在内存上运行应用程序。否则你会得到错误,但还没有解决......