// Internal routine used to create a temporary permission set (given a // set of security attribute classes as input) and return the serialized // version. May actually return two sets, split into CAS and non-CAS // variants. private static byte[] CreateSerialized(Object[] attrs, ref byte[] nonCasBlob) { // Create two new (empty) sets. PermissionSet casPset = new PermissionSet(false); PermissionSet nonCasPset = new PermissionSet(false); // Most security attributes generate a single permission. The // PermissionSetAttribute class generates an entire permission set we // need to merge, however. for (int i = 0; i < attrs.Length; i++) if (attrs[i] is PermissionSetAttribute) { PermissionSet pset = null; pset = ((PermissionSetAttribute)attrs[i]).CreatePermissionSet(); if (pset == null) { throw new ArgumentException( Environment.GetResourceString( "Argument_UnableToGeneratePermissionSet" ) ); } if (pset.m_normalPermSet != null) { for (int j = 0; j <= pset.m_normalPermSet.GetMaxUsedIndex(); ++j) { IPermission perm = (IPermission)pset.m_normalPermSet.GetItem(j); if (perm != null) { if (perm is CodeAccessPermission) casPset.AddPermission(perm); else nonCasPset.AddPermission(perm); } } } if (pset.IsUnrestricted()) casPset.SetUnrestricted(true); if (pset.m_unrestrictedPermSet != null) { for (int j = 0; j <= pset.m_unrestrictedPermSet.GetMaxUsedIndex(); ++j) { IPermission perm = (IPermission)pset.m_unrestrictedPermSet.GetItem(j); if (perm != null) { if (perm is CodeAccessPermission) casPset.AddPermission(perm); else nonCasPset.AddPermission(perm); } } } } else { IPermission perm = ((SecurityAttribute)attrs[i]).CreatePermission(); if (perm is CodeAccessPermission) casPset.AddPermission(perm); else nonCasPset.AddPermission(perm); } // Serialize the set(s). if (!nonCasPset.IsEmpty()) nonCasBlob = nonCasPset.EncodeXml(); return casPset.IsEmpty() ? null : casPset.EncodeXml(); }