我不断
An exception of type 'System.Runtime.Serialization.SerializationException'
occurred in IRCBot.exe but was not handled in user code
从 AppDomain.DoCallBack获取信息
我的代码是
object result = null;
try {
Console.WriteLine("Attempting to run in sandbox");
sandbox.DoCallBack(() =>
{
Console.WriteLine("Creating thread");
try
{
var scriptThread = new Thread(() =>
{
try
{
Console.WriteLine("Trying");
result = CSharpScript.RunAsync(code).ReturnValue.Result;
}
catch (Exception ex)
{
result = ex.Message;
}
});
scriptThread.Start();
if (!scriptThread.Join(6000))
{
scriptThread.Abort();
AppDomain.Unload(sandbox);
}
}
catch (Exception ex)
{
result = ex.ToString();
}
});
}
catch (Exception e)
{
result = e.ToString();
}
Run Code Online (Sandbox Code Playgroud)
抱歉,如果这个问题听起来很简短,但我真的不知道该说些什么。我已经追踪到 DoCallBack 异常的来源。先感谢您。
传递给 DoCallback 的委托必须表示静态方法或可序列化类上的方法。C# 编译器为 lambda 表达式自动生成的类不可序列化。您需要自己实现应该在可序列化类上调用的方法,例如
[Serializable]
class CallbackContext
{
public string Code { get; set; }
public void Entry()
{
Console.WriteLine("Creating thread");
try
{
var scriptThread = new Thread(() =>
{
try
{
Console.WriteLine("Trying");
AppDomain.CurrentDomain.SetData("result", CSharpScript.RunAsync(Code).ReturnValue.Result);
}
catch (Exception ex)
{
AppDomain.CurrentDomain.SetData("result", ex.Message);
}
});
scriptThread.Start();
if (!scriptThread.Join(6000))
{
scriptThread.Abort();
AppDomain.Unload(AppDomain.CurrentDomain);
}
}
catch (Exception ex)
{
AppDomain.CurrentDomain.SetData("result", ex.ToString());
}
}
}
...
object result = null;
try {
Console.WriteLine("Attempting to run in sandbox");
CallbackContext ctx = new CallbackContext();
ctx.Code = code;
sandbox.DoCallBack(ctx.Entry);
result = sandbox.GetData("result");
}
catch (Exception e)
{
result = e.ToString();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2039 次 |
最近记录: |