.net 处理应用程序在bat文件中崩溃
我有一个用C#编写的应用程序(.NET控制台应用程序),在服务器上运行。有时(大约每周2次)应用程序崩溃,例如,这可能是由网络故障或类似情况引起的,但这并不重要,但我想要的是,当应用程序崩溃时,我希望它只是静静地重新启动。我无法重写应用程序来执行此操作,因为我没有源代码,我希望有一个简单的解决方案,因此我尝试创建一个bat文件,如下所示:.net 处理应用程序在bat文件中崩溃,.net,batch-file,application-restart,.net,Batch File,Application Restart,我有一个用C#编写的应用程序(.NET控制台应用程序),在服务器上运行。有时(大约每周2次)应用程序崩溃,例如,这可能是由网络故障或类似情况引起的,但这并不重要,但我想要的是,当应用程序崩溃时,我希望它只是静静地重新启动。我无法重写应用程序来执行此操作,因为我没有源代码,我希望有一个简单的解决方案,因此我尝试创建一个bat文件,如下所示: :start @BotR.TestR.exe echo sleeping @ping 123.45.67.89 -n 1 -w %1000 > nul
:start
@BotR.TestR.exe
echo sleeping
@ping 123.45.67.89 -n 1 -w %1000 > nul
goto start
ModuleDefinition module = ModuleDefinition.ReadModule(fileName);
var entryPoint = module.EntryPoint.Body;
var corlib = module.TypeSystem.Corlib;
var exceptionTypeReference = new TypeReference(
"System", "Exception", null, corlib, false);
exceptionTypeReference = module.Import(exceptionTypeReference);
var entryPointIL = entryPoint.GetILProcessor();
var objectTypeReference = new TypeReference(
"System", "Object", null, corlib, false);
objectTypeReference = module.Import(objectTypeReference);
var writeLineMethod =
new MethodReference(
"WriteLine",
new TypeReference("System", "Void", null, corlib, true),
new TypeReference("System", "Console", null, corlib, false))
{ Parameters = { new ParameterDefinition(objectTypeReference) } };
writeLineMethod = module.Import(writeLineMethod);
var callWriteLine = entryPointIL.Create(OpCodes.Call, writeLineMethod);
entryPointIL.Append(callWriteLine);
entryPointIL.Emit(OpCodes.Br, entryPoint.Instructions.First());
var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
CatchType = exceptionTypeReference,
TryStart = entryPoint.Instructions.First(),
TryEnd = callWriteLine,
HandlerStart = callWriteLine,
HandlerEnd = entryPoint.Instructions.Last()
};
entryPoint.ExceptionHandlers.Add(exceptionHandler);
module.Write(fileName);
class Program
{
void Main()
{
while (true)
{
try
{
OtherApplication.Program.Main();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
但是,每当应用程序(BotR.TestR.exe)崩溃时,它就会弹出一个弹出窗口,告知应用程序崩溃,witch会阻止它继续运行,从而阻止它重新启动。有什么简单的方法可以解决这个问题吗?我不确定这是否是最好的方法,但您可以使用以下方法重写应用程序:
:start
@BotR.TestR.exe
echo sleeping
@ping 123.45.67.89 -n 1 -w %1000 > nul
goto start
ModuleDefinition module = ModuleDefinition.ReadModule(fileName);
var entryPoint = module.EntryPoint.Body;
var corlib = module.TypeSystem.Corlib;
var exceptionTypeReference = new TypeReference(
"System", "Exception", null, corlib, false);
exceptionTypeReference = module.Import(exceptionTypeReference);
var entryPointIL = entryPoint.GetILProcessor();
var objectTypeReference = new TypeReference(
"System", "Object", null, corlib, false);
objectTypeReference = module.Import(objectTypeReference);
var writeLineMethod =
new MethodReference(
"WriteLine",
new TypeReference("System", "Void", null, corlib, true),
new TypeReference("System", "Console", null, corlib, false))
{ Parameters = { new ParameterDefinition(objectTypeReference) } };
writeLineMethod = module.Import(writeLineMethod);
var callWriteLine = entryPointIL.Create(OpCodes.Call, writeLineMethod);
entryPointIL.Append(callWriteLine);
entryPointIL.Emit(OpCodes.Br, entryPoint.Instructions.First());
var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
CatchType = exceptionTypeReference,
TryStart = entryPoint.Instructions.First(),
TryEnd = callWriteLine,
HandlerStart = callWriteLine,
HandlerEnd = entryPoint.Instructions.Last()
};
entryPoint.ExceptionHandlers.Add(exceptionHandler);
module.Write(fileName);
class Program
{
void Main()
{
while (true)
{
try
{
OtherApplication.Program.Main();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
这段代码的作用是获取应用程序的入口点(通常是Main()
方法)并从以下位置重写它:
static void Main()
{
// some code
}
为此:
static void Main()
{
while (true)
{
try
{
// some code
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
编辑:
如果Main()
方法和contain类是公共的,那么有一种更简单的方法:创建一个应用程序,将另一个作为引用,并运行其Main()
。大概是这样的:
:start
@BotR.TestR.exe
echo sleeping
@ping 123.45.67.89 -n 1 -w %1000 > nul
goto start
ModuleDefinition module = ModuleDefinition.ReadModule(fileName);
var entryPoint = module.EntryPoint.Body;
var corlib = module.TypeSystem.Corlib;
var exceptionTypeReference = new TypeReference(
"System", "Exception", null, corlib, false);
exceptionTypeReference = module.Import(exceptionTypeReference);
var entryPointIL = entryPoint.GetILProcessor();
var objectTypeReference = new TypeReference(
"System", "Object", null, corlib, false);
objectTypeReference = module.Import(objectTypeReference);
var writeLineMethod =
new MethodReference(
"WriteLine",
new TypeReference("System", "Void", null, corlib, true),
new TypeReference("System", "Console", null, corlib, false))
{ Parameters = { new ParameterDefinition(objectTypeReference) } };
writeLineMethod = module.Import(writeLineMethod);
var callWriteLine = entryPointIL.Create(OpCodes.Call, writeLineMethod);
entryPointIL.Append(callWriteLine);
entryPointIL.Emit(OpCodes.Br, entryPoint.Instructions.First());
var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
CatchType = exceptionTypeReference,
TryStart = entryPoint.Instructions.First(),
TryEnd = callWriteLine,
HandlerStart = callWriteLine,
HandlerEnd = entryPoint.Instructions.Last()
};
entryPoint.ExceptionHandlers.Add(exceptionHandler);
module.Write(fileName);
class Program
{
void Main()
{
while (true)
{
try
{
OtherApplication.Program.Main();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
我不确定这是否是最好的方法,但您可以使用重写应用程序来执行以下操作:
:start
@BotR.TestR.exe
echo sleeping
@ping 123.45.67.89 -n 1 -w %1000 > nul
goto start
ModuleDefinition module = ModuleDefinition.ReadModule(fileName);
var entryPoint = module.EntryPoint.Body;
var corlib = module.TypeSystem.Corlib;
var exceptionTypeReference = new TypeReference(
"System", "Exception", null, corlib, false);
exceptionTypeReference = module.Import(exceptionTypeReference);
var entryPointIL = entryPoint.GetILProcessor();
var objectTypeReference = new TypeReference(
"System", "Object", null, corlib, false);
objectTypeReference = module.Import(objectTypeReference);
var writeLineMethod =
new MethodReference(
"WriteLine",
new TypeReference("System", "Void", null, corlib, true),
new TypeReference("System", "Console", null, corlib, false))
{ Parameters = { new ParameterDefinition(objectTypeReference) } };
writeLineMethod = module.Import(writeLineMethod);
var callWriteLine = entryPointIL.Create(OpCodes.Call, writeLineMethod);
entryPointIL.Append(callWriteLine);
entryPointIL.Emit(OpCodes.Br, entryPoint.Instructions.First());
var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
CatchType = exceptionTypeReference,
TryStart = entryPoint.Instructions.First(),
TryEnd = callWriteLine,
HandlerStart = callWriteLine,
HandlerEnd = entryPoint.Instructions.Last()
};
entryPoint.ExceptionHandlers.Add(exceptionHandler);
module.Write(fileName);
class Program
{
void Main()
{
while (true)
{
try
{
OtherApplication.Program.Main();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
这段代码的作用是获取应用程序的入口点(通常是Main()
方法)并从以下位置重写它:
static void Main()
{
// some code
}
为此:
static void Main()
{
while (true)
{
try
{
// some code
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
编辑:
如果Main()
方法和contain类是公共的,那么有一种更简单的方法:创建一个应用程序,将另一个作为引用,并运行其Main()
。大概是这样的:
:start
@BotR.TestR.exe
echo sleeping
@ping 123.45.67.89 -n 1 -w %1000 > nul
goto start
ModuleDefinition module = ModuleDefinition.ReadModule(fileName);
var entryPoint = module.EntryPoint.Body;
var corlib = module.TypeSystem.Corlib;
var exceptionTypeReference = new TypeReference(
"System", "Exception", null, corlib, false);
exceptionTypeReference = module.Import(exceptionTypeReference);
var entryPointIL = entryPoint.GetILProcessor();
var objectTypeReference = new TypeReference(
"System", "Object", null, corlib, false);
objectTypeReference = module.Import(objectTypeReference);
var writeLineMethod =
new MethodReference(
"WriteLine",
new TypeReference("System", "Void", null, corlib, true),
new TypeReference("System", "Console", null, corlib, false))
{ Parameters = { new ParameterDefinition(objectTypeReference) } };
writeLineMethod = module.Import(writeLineMethod);
var callWriteLine = entryPointIL.Create(OpCodes.Call, writeLineMethod);
entryPointIL.Append(callWriteLine);
entryPointIL.Emit(OpCodes.Br, entryPoint.Instructions.First());
var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
CatchType = exceptionTypeReference,
TryStart = entryPoint.Instructions.First(),
TryEnd = callWriteLine,
HandlerStart = callWriteLine,
HandlerEnd = entryPoint.Instructions.Last()
};
entryPoint.ExceptionHandlers.Add(exceptionHandler);
module.Write(fileName);
class Program
{
void Main()
{
while (true)
{
try
{
OtherApplication.Program.Main();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
你能改变C#应用程序吗,这样它就不会在窗口中崩溃?他在问题中说,他没有源代码。因此,用普通方法改变它不是一个选项。你能改变C#应用程序吗,这样它就不会在窗口中崩溃?他在问题中说,他没有来源。所以,用普通方法改变它不是一个选项。所以我必须实际改变应用程序?我不可能仅仅“关闭”应用程序的默认行为,在崩溃时显示对话框,然后静默退出?我想要这样的东西:
Main(){try{/*code*/}catch{}}
如果你明白我的意思,我想做这件事,如果可能的话,不必使用cecil重新编译。我不是说这是唯一的方法。我不知道你能否改变这种行为。但是如果Main()
还有(至少)一种方法:请参见编辑我的答案。那么我必须实际更改应用程序吗?我不可能仅仅“关闭”应用程序的默认行为,在崩溃时显示对话框,然后静默退出?我想要这样的东西:Main(){try{/*code*/}catch{}}
如果你明白我的意思,我想做这件事,如果可能的话,不必使用cecil重新编译。我不是说这是唯一的方法。我不知道你能否改变这种行为。但是如果Main()
还有(至少)一种方法:请参见编辑我的答案。