这有点是我之前提出的问题的后续问题,虽然我现在能够提供更多代码来改善我的问题,并进一步显示我在这方面遇到的麻烦。
我这里有三个例程。其中两个例程一起工作 - 如果成功,将使用System.Reflection将程序集加载到内存中。如果文件没有正确加载到内存中,我希望这些例程返回错误,但由于某些原因,这些try-catch语句根本不会按照我想要的方式工作。
注意:要使此例程起作用,文件必须是.net程序集。例如,如果文件是在VB6中编程的,则会抛出错误。这是我试图回复给我的错误。
private void ExecuteDataIntoMemory(string filePath)
{
byte[] bytes = File.ReadAllBytes(filePath);
try
{
ExecFile(bytes);
MessageBox.Show("successfully loaded this file into memory");
}
catch
{
MessageBox.Show("Could not load this file into memory");
}
}
private static void ExecFile(byte[] data)
{
try
{
//Work around for "SetCompatibleTextRenderingDefault"
System.Threading.Thread T = new System.Threading.Thread(ExecFile);
//Set STA to support drag/drop and dialogs?
T.SetApartmentState(System.Threading.ApartmentState.STA);
T.Start(data);
}
catch
{
MessageBox.Show("caught some error ...");
}
}
private static void ExecFile(object o)
{
System.Reflection.MethodInfo T = System.Reflection.Assembly.Load((byte[])o).EntryPoint;
if (T.GetParameters().Length == 1)
T.Invoke(null, new object[] { new string[] { } });
else
T.Invoke(null, null);
}
如果有必要,我可以澄清更多信息,但我不确定此时还包括哪些其他信息。
答案 0 :(得分:1)
在ExecFile的catch语句中使用“throw”语句来引发ExecFile中捕获的相同“异常”(或错误)。例如:
catch {
throw;
}
我想我发现了问题。 ExecFile(byte [])启动线程并立即返回,而不等待线程退出。要允许该方法等待线程退出,请添加:
T.Join();
在启动线程后立即执行。 (为了避免可能的歧义,你应该重命名ExecFile(object)。我也不确定ExecFile(byte [])是否会从ExecFile(object)中捕获异常。)
答案 1 :(得分:0)
如果你在ExecFile(byte[] data)
中捕获异常,它将不会在你的父方法(ExecuteDataIntoMemory(string filePath)
)中传播,然后不再被捕获
如果您确实需要捕获两次异常,请以这种方式重写您的子方法
private static void ExecFile(byte[] data)
{
try
{
//Work around for "SetCompatibleTextRenderingDefault"
System.Threading.Thread T = new System.Threading.Thread(ExecFile);
//Set STA to support drag/drop and dialogs?
T.SetApartmentState(System.Threading.ApartmentState.STA);
T.Start(data);
}
catch (Exception ex)
{
MessageBox.Show("caught some error ...");
throw ex;
}
}
如果没有,那么这个方法中的错误就不会try..catch
,并且会传播异常。
答案 2 :(得分:0)
如果我理解你,那么只有ExecuteDataIntoMemory
成功才能评估ExecFile
。
1-您正在运行一个新线程来执行将在不同线程中执行的ExecFile
方法。因此,首先在try
ExecFile(byte[] data)
块中运行ExecFile(data)
而不使用新线程,因为您想以任何方式等待它:
try
{
ExecFile(data);
}
2-请注意,您有两个具有相同名称的方法'ExecFile(byte [] data)'和ExecFile(object o)
您传递的数据来自类型byte[]
,因此它将是无限递归或直到堆栈溢出异常被提出。所以你应该将data
转换为object,然后将其传递给方法,即:
try
{
ExecFile((object)data);
}
3-在ExecFile(byte [] data)方法的catch
块中重新抛出异常,以便可以从调用方法2中处理它,即:
try
{
ExecFile((object)data);
}
catch
{
MessageBox.Show("caught some error ...");
throw;
}
答案 3 :(得分:0)
只需查看callstack哪个方法再次调用ExecuteDataIntoMemory方法?
如果您使用Visual Studio IDE,请在消息框中添加断点:
MessageBox.Show("successfully loaded this file into memory");
然后简单转到视图菜单,从那里找到要显示的callstack窗口并查看callstack(向callstack显示外部代码)
也许这可能会有所帮助。
答案 4 :(得分:0)
粗略的方式(我认为),但应该适用于您的情况,订阅
AppDomain.CurrentDomain.UnhandledException
事件已发生变化,它将直接从函数ExecFile(object o);
或者创建一个状态机,如果ExecFile(object o);
方法出现任何异常,则设置为NEGATIVE状态。
或者只是不要在多线程中执行:)