AppDomain.DoCallBack 返回 System.Runtime.Serialization.SerializationException

Dhr*_*tel 5 c#

我不断 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 异常的来源。先感谢您。

poi*_*n42 5

传递给 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)