好的,所以我有这个 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);
}