System.Reflection calls crashing Unity

Having a bit of an oddball issue here. I’m attempting to dump a scene to XML using Reflection and Unity crashes/is forced to close.

I’m fairly certain I’ve pinpointed the issue to a single line:


I get the property (prop) from a list of properties generated from a Component (comp) and then I make this call:

prop.GetValue(comp, (object[])null);

When the code hits that line, Unity freezes up and I get the lovely “UnityEditor has stopped working” popup.
Sometimes, however, the code will work to a point (there’s a debug for this: At Text) and then stop. If the script is run again, then the crash happens.

EDIT: Thanks to Ricardo Arango for trying it out and showing that it worked with simple objects and scripts. Now the problem is that it doesn’t work with some scripts, the one that definitely doesn’t work is AnB’s UIButton. This also happens to be the home of that Text property that I mentioned above.
Here’s the code:

public static void WriteFromProject()
		//setup the settings and path
		XmlWriterSettings xmlSettings = new XmlWriterSettings();
		xmlSettings.Indent = true;
		string path = "xml/test.xml";
		//create the writer
		using(XmlWriter writer = XmlWriter.Create(path, xmlSettings))
			//write the header
			//write the header
			//grab all the objects
			UnityEngine.Object[] objs = GameObject.FindObjectsOfType(typeof(GameObject));
			foreach(GameObject obj in objs)
				//open the tag for a gameobject
				//set the attributes
				writer.WriteAttributeString("objType", obj.GetType().ToString());
				//for each component, push a tag
				Component[] comps = obj.GetComponents(typeof(Component));
				//TODO: Do more for attaching scripts/components later
				foreach(Component comp in comps)
					//get the type object
					Type compType = comp.GetType();

					//open the component tag
					//set the name as an attribute
					writer.WriteAttributeString("Name", compType.FullName);
					Debug.Log("Component Name: " + compType.FullName);
					//writer.WriteElementString("Component", compType);
					//open fields tag
					//then, dump all the fields with it
					//do this for call base classes as well
					//TODO: Only grab public variables
					for(;compType != null; compType = compType.BaseType)
						//make a subtree for every class/baseclass
						//have the class name for an attribute
						writer.WriteAttributeString("Name", compType.FullName);
						PropertyInfo[] properties = compType.GetProperties();
						Debug.Log("Field Length" + properties.Length + " " + "for " + compType.FullName);
						foreach(PropertyInfo prop in properties)
							//if we're not allowed to read or write this, move on
							//reason being: 1) Right now we need to read it. 2) When read from xml, we'll need to write it too
							if(!(prop.CanRead || prop.CanWrite))
							if(prop.Name.CompareTo("Text") == 0)
								Debug.Log("At Text");
							prop.GetValue(comp, (object[])null);
						//close the class subtree
					//close fields tag
					//close component tag
				//close the gameobject element
			//write end of doc

Any thoughts?

That works fine for me in a simple scene (camera + cube). Try debugging the code to see what the values of the variables are.

Hey! You’re right! If I take out an object that was using some middleware script (AnB’s UIButton), then it works just fine.

Now looking into why it crashes with that script attached…