public ISteamMatchmakingRulesResponse(ISteamMatchmakingRulesResponse.RulesResponded onRulesResponded, ISteamMatchmakingRulesResponse.RulesFailedToRespond onRulesFailedToRespond, ISteamMatchmakingRulesResponse.RulesRefreshComplete onRulesRefreshComplete) { if (onRulesResponded == null || onRulesFailedToRespond == null || onRulesRefreshComplete == null) { throw new ArgumentNullException(); } this.m_RulesResponded = onRulesResponded; this.m_RulesFailedToRespond = onRulesFailedToRespond; this.m_RulesRefreshComplete = onRulesRefreshComplete; this.m_VTable = new ISteamMatchmakingRulesResponse.VTable { m_VTRulesResponded = new ISteamMatchmakingRulesResponse.InternalRulesResponded(this.InternalOnRulesResponded), m_VTRulesFailedToRespond = new ISteamMatchmakingRulesResponse.InternalRulesFailedToRespond(this.InternalOnRulesFailedToRespond), m_VTRulesRefreshComplete = new ISteamMatchmakingRulesResponse.InternalRulesRefreshComplete(this.InternalOnRulesRefreshComplete) }; this.m_pVTable = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ISteamMatchmakingRulesResponse.VTable))); Marshal.StructureToPtr(this.m_VTable, this.m_pVTable, false); this.m_pGCHandle = GCHandle.Alloc(this.m_pVTable, GCHandleType.Pinned); }