1

好的,所以我有这个 python 代码

_events.GameStart += method

method():
    DoStuff

在 c# 方面

[SecuritySafeCritical]
public class ScriptEvents: MarshalByRefObject
{
    public event Action GameStart;

    public ScriptEvents(Engine e)
    {
        _engine = e;
    }

    public void FireGameStart()
    {
        if(GameStart != null)
          GameStart.Invoke();
    }
}

所以我传入ScriptEvents. _events这对于像这样的python调用方法效果很好_events.FireGameStart(),但我无法附加到事件。

我最终得到一个错误,说不能序列化委托。现在我已经尝试使用CrossAppDomainDelegate,但这似乎并没有解决问题。

我想知道是否有某种神奇的方法可以将该委托扔到墙上,以便我可以从 c# 端调用它并激活后续的 python 代码?

此外,如果它是相关的

var Events = new ScriptEvents();
AppDomain sandbox = CreateSandbox(forTesting);
var _engine = Python.CreateEngine(sandbox);
ScriptScope scope = _engine.CreateScope();
scope.SetVariable("_events",Events);
var _sponsor = new Sponsor();
var life = (ILease) RemotingServices.GetLifetimeService(Events);
life.Register(_sponsor);

private static AppDomain CreateSandbox(bool forTesting)
{
    var permissions = new PermissionSet(PermissionState.Unrestricted);
    var appinfo = new AppDomainSetup {ApplicationBase = AppDomain.CurrentDomain.BaseDirectory};
    return AppDomain.CreateDomain("Scripting sandbox", null, appinfo, permissions);
}
4

0 回答 0