【问题标题】:Is it possible to set a JavaScript callback method to a C# method using Marshalling?是否可以使用 Marshalling 将 JavaScript 回调方法设置为 C# 方法?
【发布时间】:2016-12-11 03:52:22
【问题描述】:

我正在使用 C# 在 Unity 中进行编码并为 WebGL 进行开发。我需要使用浏览器 JavaScript,因此编写了一个 .jslib,我使用 Marshalling 调用 C# 中的方法。

我是否可以像这样将 JavaScript 回调设置为 C# Action、Func 或 Event Handler:

// Javascript in .jslib called from C# using static extern
// action being the C# method that I want to call
// On callback I get -> TypeError: action is not a function
SetOnOpen: function (action) {
    $jsobj.onopen = function () {
        action();
    };
},

我已经尝试了其中的每一个,但似乎没有正确执行。我知道 C++ 可以调用 C# 函数,但是 JavaScript 必须以不同的方式进行通信。

尝试:

[DllImport("__Internal")]
private static extern void SetOnOpen(ref OnOpenHandler handler);

[DllImport("__Internal")]
private static extern void SetOnOpen(ref Action action);

[DllImport("__Internal")]
private static extern void SetOnOpen(IntPtr handler);

无论我尝试什么,我都会收到一个 TypeError 说明我传递给 JavaScript 的对象不是函数。我试过了:

  • 使用操作和事件委托
  • 使用 ref、IntPtr 和不使用

有人知道这是否可能吗?就像我说的,我之前在 C++ .dll 中成功调用了 C# 方法,因此认为可以从 .jslib 中调用。

【问题讨论】:

标签: javascript c# unity3d marshalling unity-webgl


【解决方案1】:

根据我的经验,使两者通信的唯一方法是通过 SendMessage。如果需要携带多个参数,可以附加一个数组。

【讨论】:

  • 感谢您的回复!我想避免 GameObject.Find() 和 Reflection 调用。 :( 最后我只是在 Simple WebSockets for WebGL 中模拟 Unity 的示例,并使用一个不断检查新消息的 Enumerator。不是最漂亮的,但它比发送消息更有效,而且效果很好。:)
猜你喜欢
  • 1970-01-01
  • 2020-12-09
  • 2011-07-11
  • 2017-08-30
  • 1970-01-01
  • 2012-05-03
  • 2017-01-26
  • 2010-09-16
  • 2010-10-28
相关资源
最近更新 更多