private void CreateNativeObject() { var node = DomNode; if (DomNode == null || m_instanceId != 0) { return; } var doc = node.GetRoot().As <NativeDocumentAdapter>(); if (doc != null && doc.ManageNativeObjectLifeTime) { // The object might have a pre-assigned instance id. // If so, we should attempt to use that same id. // This is important if we want the id to persist between sessions // -- For example, we must reference placement objects through // a GUID value that remains constant. We don't want to create // new temporary ids for placements every time we create them, // when the GUID value is more reliable ulong existingId = 0; var idField = DomNode.Type.GetAttributeInfo("ID"); if (idField != null) { var id = DomNode.GetAttribute(idField); if (id is UInt64) { existingId = (UInt64)id; } else { string stringId = id as string; if (stringId != null && stringId.Length > 0) { if (!UInt64.TryParse(stringId, out existingId)) { existingId = GUILayer.Utils.HashID(stringId); } } } } using (var transfer = new NativePropertyTransfer()) { using (var stream = transfer.CreateStream()) { foreach (AttributeInfo attribInfo in this.DomNode.Type.Attributes) { UpdateNativeProperty(DomNode, attribInfo, transfer.Properties, stream); } UpdateSecondaryNativeProperties(transfer.Properties, stream); m_instanceId = GameEngine.CreateObject(doc.NativeDocumentId, existingId, TypeId, transfer.Properties); } } if (m_instanceId != 0) { m_documentId = doc.NativeDocumentId; GameEngine.RegisterGob(m_documentId, m_instanceId, this); } } }