/// <summary> /// Reads value of attribute and returns it as attribute array /// </summary> /// <param name="attribute">Attribute whose value should be read</param> /// <param name="value">Location that receives attribute value</param> public static void ConvertValue(ref CK_ATTRIBUTE attribute, out CK_ATTRIBUTE[] value) { int ckAttributeSize = UnmanagedMemory.SizeOf(typeof(CK_ATTRIBUTE)); int attrCount = Convert.ToInt32(attribute.valueLen) / ckAttributeSize; int attrCountMod = Convert.ToInt32(attribute.valueLen) % ckAttributeSize; if (attrCountMod != 0) { throw new Exception("Unable to convert attribute value to attribute array"); } if (attrCount == 0) { value = null; } else { CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[attrCount]; for (int i = 0; i < attrCount; i++) { IntPtr tempPointer = new IntPtr(attribute.value.ToInt64() + (i * ckAttributeSize)); #if SILVERLIGHT CK_ATTRIBUTE_CLASS attrClass = (CK_ATTRIBUTE_CLASS)UnmanagedMemory.Read(tempPointer, typeof(CK_ATTRIBUTE_CLASS)); attrClass.ToCkAttributeStruct(ref attrs[i]); #else attrs[i] = (CK_ATTRIBUTE)UnmanagedMemory.Read(tempPointer, typeof(CK_ATTRIBUTE)); #endif } value = attrs; } }