什么可能导致 MarshalDirectiveException?

问题描述

我正在努力将

enter image description here

实施到 Unity 格斗游戏中。当我尝试启动会话时,它抛出此错误

"Compiled sass\file.scss to css\filecompiled.css."

我正在使用 Mirror 创建一个大厅,当我尝试启动 UnityGGPO 时,我从该进程中提取连接信息。

UnityGGPO 包中附带了一个示例游戏“VectorWar”来展示如何使用它,VectorWar 不会导致此错误。 我的代码中导致此问题的调用如下所示:

MarshalDirectiveException: The type `System.Object' layout needs to be Sequential or Explicit
GGPO.StartSession (system.intPtr& session,system.intPtr beginGame,system.intPtr advanceFrame,system.intPtr loadGameState,system.intPtr logGameState,system.intPtr saveGameState,system.intPtr freeBuffer,system.intPtr onEvent,System.String game,system.int32 num_players,system.int32 localport) (at Assets/UnityGGPO/Scripts/GGPO.cs:240)
GGPO+Session.StartSession (GGPO+BeginGameDelegate beginGame,GGPO+AdvanceFrameDelegate advanceFrame,GGPO+Session+SafeLoadGameStateDelegate loadGameState,GGPO+Session+SafeLogGameStateDelegate logGameState,GGPO+Session+SafeSaveGameStateDelegate saveGameState,GGPO+Session+SafeFreeBufferDelegate freeBuffer,GGPO+Session+OnEventConnectedToPeerDelegate onEventConnectedToPeer,GGPO+Session+OnEventSynchronizingWithPeerDelegate onEventSynchronizingWithPeer,GGPO+Session+OnEventSynchronizedWithPeerDelegate onEventSynchronizedWithPeer,GGPO+Session+OnEventRunningDelegate onEventRunning,GGPO+Session+OnEventConnectionInterruptedDelegate onEventConnectionInterrupted,GGPO+Session+OnEventConnectionResumedDelegate onEventConnectionResumed,GGPO+Session+OnEventdisconnectedFromPeerDelegate onEventdisconnectedFromPeer,GGPO+Session+OnEventEventcodeTimesyncDelegate onEventTimesync,System.String gameName,system.int32 numPlayers,system.int32 localport) (at Assets/UnityGGPO/Scripts/GGPOSession.cs:110)
Combatinitializer.Init (system.int32 localport,System.Collections.Generic.List`1[T] playersnSlot,system.int32 num_spectators) (at Assets/GameplayManager/SupportScripts/SceneManagers/Combatinitializer.cs:203)
CombatRunner.InitRemote () (at Assets/GameplayManager/SupportScripts/SceneManagers/CombatRunner.cs:178)
CombatRunner.Startup () (at Assets/GameplayManager/SupportScripts/SceneManagers/CombatRunner.cs:103)
CombatRunner.CheckConnections () (at Assets/GameplayManager/SupportScripts/SceneManagers/CombatRunner.cs:110)
ConnectionObject.UserCode_PassConnection (System.String ip,System.Boolean spectator,system.int32 count,System.UInt32 conn) (at Assets/GameplayManager/SupportScripts/Networking/ConnectionObject.cs:475)
ConnectionObject.InvokeUserCode_PassConnection (Mirror.NetworkBehavIoUr obj,Mirror.NetworkReader reader,Mirror.NetworkConnection senderConnection) (at <ececad73af214c9aa7c277652651f986>:0)
Mirror.RemoteCalls.RemoteCallHelper.InvokeHandlerDelegate (system.int32 cmdHash,Mirror.MirrorInvokeType invokeType,Mirror.NetworkBehavIoUr invokingType,Mirror.NetworkConnectionToClient senderConnection) (at Assets/Mirror/Runtime/RemoteCallHelper.cs:165)
Mirror.NetworkIdentity.HandleRemoteCall (system.int32 componentIndex,system.int32 functionHash,Mirror.NetworkConnectionToClient senderConnection) (at Assets/Mirror/Runtime/NetworkIdentity.cs:1226)
Mirror.NetworkIdentity.HandleRPC (system.int32 componentIndex,system.int32 rpcHash,Mirror.NetworkReader reader) (at Assets/Mirror/Runtime/NetworkIdentity.cs:1296)
Mirror.ClientScene.OnRPcmessage (Mirror.Rpcmessage msg) (at Assets/Mirror/Runtime/ClientScene.cs:996)
Mirror.NetworkClient+<>c__displayClass31_0`1[T].<RegisterHandler>b__0 (Mirror.NetworkConnection _,T value) (at Assets/Mirror/Runtime/NetworkClient.cs:333)
Mirror.MessagePacker+<>c__displayClass7_0`2[T,C].<MessageHandler>b__0 (Mirror.NetworkConnection conn,system.int32 channelId) (at Assets/Mirror/Runtime/MessagePacker.cs:148)
Mirror.NetworkConnection.InvokeHandler (system.int32 msgType,system.int32 channelId) (at Assets/Mirror/Runtime/NetworkConnection.cs:225)
Mirror.NetworkConnection.TransportReceive (System.ArraySegment`1[T] buffer,system.int32 channelId) (at Assets/Mirror/Runtime/NetworkConnection.cs:278)
Mirror.ULocalConnectionToServer.Update () (at Assets/Mirror/Runtime/LocalConnections.cs:113)
Mirror.NetworkClient.Update () (at Assets/Mirror/Runtime/NetworkClient.cs:263)
Mirror.NetworkManager.LateUpdate () (at Assets/Mirror/Runtime/NetworkManager.cs:283)

VectorWar 调用几乎相同:

var result = GGPO.Session.StartSession(begin_game_callback,advance_frame_callback,load_game_state_callback,log_game_state,save_game_state_callback,free_buffer_callback,OnEventConnectedToPeerDelegate,OnEventSynchronizingWithPeerDelegate,OnEventSynchronizedWithPeerDelegate,OnEventRunningDelegate,OnEventConnectionInterruptedDelegate,OnEventConnectionResumedDelegate,OnEventdisconnectedFromPeerDelegate,OnEventEventcodeTimesyncDelegate,"combat",num_players,localport);

这些函数回调也几乎相同(相同的返回类型、相同的参数、公共静态)并且在几乎相同的类中调用(公共静态类)。

现在我的理解是,这些都与我们的好朋友 Marshal 没有任何关系,但我之前并没有真正使用过 marshaler,当我检查发送到 .dll 的各个参数的布局时,它们都是“顺序或显式”。

我将继续深入研究 C++ 代码,以便对正在发送的地址之一进行可能的操作,但到目前为止,它们都只是回调,所以我看不出这对我来说与 VectorWar 有何不同。

如果您能深入了解与封送拆收器相关的人员会怀疑哪种环境属性,我们将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)