private unsafe bool LookupObject (Value *top_level, Value *parent, string xmlns, string name, bool create, bool is_property, out Value value)
{
if (name == null)
throw new ArgumentNullException ("type_name");
if (is_property) {
int dot = name.IndexOf ('.');
return LookupPropertyObject (top_level, parent, xmlns, name, dot, create, out value);
}
if (top_level == null && xmlns == null) {
return LookupComponentFromName (top_level, name, create, out value);
}
string assembly_name = AssemblyNameFromXmlns (xmlns);
string clr_namespace = ClrNamespaceFromXmlns (xmlns);
string full_name = string.IsNullOrEmpty (clr_namespace) ? name : clr_namespace + "." + name;
Type type = LookupType (top_level, assembly_name, full_name);
if (type == null) {
Console.Error.WriteLine ("ManagedXamlLoader::LookupObject: GetType ({0}) failed using assembly: {1} ({2}, {3}).", name, assembly_name, xmlns, full_name);
value = Value.Empty;
return false;
}
if (create) {
if (!type.IsPublic) {
value = Value.Empty;
throw new XamlParseException ("Attempting to create a private type");
}
object res = null;
try {
res = Activator.CreateInstance (type);
} catch (TargetInvocationException ex) {
Console.WriteLine (ex);
Console.Error.WriteLine ("ManagedXamlLoader::LookupObject: CreateInstance ({0}) failed: {1}", name, ex.InnerException);
value = Value.Empty;
return false;
}
if (res == null) {
Console.Error.WriteLine ("ManagedXamlLoader::LookupObject ({0}, {1}, {2}): unable to create object instance: '{3}', the object was of type '{4}'",
assembly_name, xmlns, name, full_name, type.FullName);
value = Value.Empty;
return false;
}
// This is freed in native.
value = Value.FromObject (res, false);
} else {
value = Value.Empty;
value.k = Deployment.Current.Types.Find (type).native_handle;
}
return true;
}