void Load(string fileName) { this.FileName = fileName; string fileText = File.ReadAllText(fileName); //find the raw plist within the .mobileprovision file int start = fileText.IndexOf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); int length; if (start < 0 || (length = (fileText.IndexOf("</plist>", start) - start)) < 1) { throw new Exception("Did not find XML plist in '" + fileName + "'"); } length += "</plist>".Length; string rawPlist = fileText.Substring(start, length); var doc = new PlistDocument(); doc.LoadFromXml(rawPlist); var rootDict = (PlistDictionary)doc.Root; var prefixes = rootDict["ApplicationIdentifierPrefix"] as PlistArray; if (prefixes != null) { this.ApplicationIdentifierPrefix = prefixes.OfType <PlistString> ().Select(x => x.Value).ToArray(); } var creationDate = rootDict ["CreationDate"] as PlistDate; if (creationDate != null) { this.CreationDate = creationDate.Value; } var devCerts = rootDict ["DeveloperCertificates"] as PlistArray; if (devCerts != null) { this.DeveloperCertificates = devCerts.OfType <PlistData> ().Select(x => new X509Certificate2(x.Value)).ToArray(); } var entl = rootDict ["Entitlements"] as PlistDictionary; if (entl != null) { this.Entitlements = entl; //string application-identifier, bool get-task-allow, string[] keychain-access-groups } var expirationDate = rootDict ["ExpirationDate"] as PlistDate; if (expirationDate != null) { this.ExpirationDate = expirationDate.Value; } var name = rootDict ["Name"] as PlistString; if (name != null) { this.Name = name.Value; } var provDevs = rootDict.TryGetValue("ProvisionedDevices") as PlistArray; if (provDevs != null) { this.ProvisionedDevices = provDevs.OfType <PlistString> ().Select(x => x.Value).ToArray(); } var ttl = rootDict ["TimeToLive"] as PlistInteger; if (ttl != null) { this.TimeToLive = ttl.Value; } var uuid = rootDict ["UUID"] as PlistString; if (uuid != null) { this.Uuid = uuid.Value; } var version = rootDict ["Version"] as PlistInteger; if (version != null) { this.Version = version.Value; } }