介绍
我将使用由David Heffernan分享的下一个C#代码示例,用于从应用程序资源中加载.NET程序集并从内存中运行它:
Assembly a = Assembly.Load(bytes);
MethodInfo method = a.EntryPoint;
if (method != null)
method.Invoke(a.CreateInstance(method.Name), null);
在这里,我只是分享了一个我自己正在使用的VB.NET适配器:
Public Shared Sub Execute(ByVal resource As Byte(), ByVal parameters As Object())
Dim ass As Assembly = Assembly.Load(resource)
Dim method As MethodInfo = ass.EntryPoint
If (method IsNot Nothing) Then
Dim instance As Object = ass.CreateInstance(method.Name)
method.Invoke(instance, parameters)
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
End Sub
问题
问题在于,如果执行的程序包含应用程序退出指令,则它也会终止我的主/宿主应用程序。例如:
从这个源代码编译出的ConsoleApplication1.exe:
Module Module1
Sub Main()
Environment.Exit(0)
End Sub
End Module
当我将 ConsoleApplication1.exe 添加到应用程序资源中,然后使用
Assembly.Load
方法加载并运行它时,由于调用了 Environment.Exit
,它也终止了我的应用程序。
问题
我如何在不修改执行的程序集源代码的情况下防止这种情况发生?也许我可以做一些类似于将一个退出事件处理程序与执行的程序集相关联以适当处理/忽略它的事情。此时我的选择是什么?请注意两件事,第一件事是我的意图是以自动化/抽象的方式解决这个问题,我的意思是最终结果应该只需要调用“Execute”方法传递资源和参数,并不用担心其他问题;第二,我希望执行的程序集同步运行,而不是异步运行……如果可能对可能的解决方案有影响,请注意这一点。PS:对我来说,无论给出的解决方案是用C#还是VB.NET编写的都无所谓。