通过反射在另一个进程内运行基于控制台的可执行文件导致“句柄无效”IOException

时间:2016-02-12 09:56:34

标签: c#

我已经将我的.exe文件上传到我的带有Entity Framework的SQL服务器,但是当我尝试执行我的.exe文件时,我得到以下异常:

  

其他信息:调用目标引发了异常。

这就是我尝试这样做的方式

mBuilder.setSubText(mSubText);

当我尝试调用异常时抛出异常,我的Main方法没有private void LoadBin_OnClick(object sender, RoutedEventArgs e) { byte[] bin = Database.GetByte(BinList.SelectedItem.ToString()); Assembly assembly = Assembly.Load(bin); MethodInfo method = assembly.EntryPoint; method.Invoke(null, null); }

  

已激活事件持续时间持续时间线程System.Reflection.TargetInvocationException:已发生异常   由调用目标抛出。 ---> System.IO.IOException:The   句柄无效。

     

at System.IO .__ Error.WinIOError(Int32 errorCode,String   maybeFullPath)at System.IO .__ Error.WinIOError()at   System.Console.set_Title(String value)at   SimpleExternal.Program.Main()---内部异常堆栈的结束   trace --- at System.RuntimeMethodHandle.InvokeMethod(Object target,   Object []参数,Signature sig,Boolean构造函数)at   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object []参数,Object []参数)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)
  在System.Reflection.MethodBase.Invoke(Object obj,Object []   参数)在Loader.MainWindow.LoadCheat_OnClick(对象发送者,   RoutedEventArgs e)in   C:\用户\布罗德\源\回购\装载机\装载机\装载机\ MainWindow.xaml.cs:线   40 9.00s

当通过string[] args加载文件并在另一个文件中托管该过程时,它工作得很好,但是当我尝试使用程序集运行它时,我得到了错误。

1 个答案:

答案 0 :(得分:1)

Console.set_Title可能来自Main周围的一些运行时包装器,也可能来自DLL / EXE中的代码。我真的不知道,但那并不重要。重要的是它在作为独立应用程序运行时运行。这意味着当你以另一种方式运行它时,某些东西没有准备好。

我想,只需确保加载并运行此dll / exe的当前应用程序也分配了控制台窗口。如果你不想要它,那么分配并隐藏它。否则,任何尝试使用触控控制台窗口的控制台类功能的尝试都将失败,因为,将没有控制台。您在该消息中看到的“句柄”指的是HWND,即句柄到窗口。

当然,您也可以尝试修改构建dll / exe的代码,以便不使用控制台窗口,或者之前检查是否存在控制台,或者至少尝试一下/捕获试图触摸控制台窗口的所有代码块。

例如,如果Console.WriteLine用于记录或状态报告,则可以将其更改为System.Diagnostics.Trace.WriteLine