+ throw new InvalidOperationException("Deserialized object is wrong type");
+ }
+ return obj;
+ }
+
+ void LoadResourceValues (ResourceCacheItem[] store)
+ {
+ ResourceInfo ri;
+ object value;
+
+ lock (readerLock) {
+ for (int i = 0; i < resourceCount; i++) {
+ ri = infos [i];
+ if (ri.TypeIndex == -1) {
+ store [i] = new ResourceCacheItem (ri.ResourceName, null);
+ continue;
+ }
+
+ reader.BaseStream.Seek (ri.ValuePosition, SeekOrigin.Begin);
+ if (resource_ver == 2)
+ value = ReadValueVer2 (ri.TypeIndex);
+ else
+ value = ReadValueVer1 (Type.GetType (typeNames [ri.TypeIndex], true));
+
+ store [i] = new ResourceCacheItem (ri.ResourceName, value);
+ }
+ }
+ }
+
+ internal UnmanagedMemoryStream ResourceValueAsStream (string name, int index)
+ {
+ ResourceInfo ri = infos [index];
+ if ((PredefinedResourceType)ri.TypeIndex != PredefinedResourceType.Stream)
+ throw new InvalidOperationException (String.Format ("Resource '{0}' was not a Stream. Use GetObject() instead.", name));
+
+ lock (readerLock) {
+ reader.BaseStream.Seek (ri.ValuePosition, SeekOrigin.Begin);
+
+ // here we return a Stream from exactly
+ // current position so that the returned
+ // Stream represents a single object stream.
+ long slen = reader.ReadInt32();
+ UnmanagedMemoryStream basePtrStream = reader.BaseStream as UnmanagedMemoryStream;
+ unsafe {
+ if (basePtrStream != null) {
+ return new UnmanagedMemoryStream (basePtrStream.PositionPointer, slen);
+ } else {
+ IntPtr ptr = Marshal.AllocHGlobal ((int) slen);
+ byte* addr = (byte*) ptr.ToPointer ();
+ UnmanagedMemoryStream ms = new UnmanagedMemoryStream (addr, slen, slen, FileAccess.ReadWrite);
+ // The memory resource must be freed
+ // when the stream is disposed.
+ ms.Closed += delegate (object o, EventArgs e) {
+ Marshal.FreeHGlobal (ptr);
+ };
+
+ byte [] bytes = new byte [slen < 1024 ? slen : 1024];
+ while (slen > 0 ) {
+ int x = reader.Read (bytes, 0, (int)Math.Min (bytes.Length, slen));
+
+ if (x == 0)
+ throw new FormatException ("The resource data is corrupt. Resource stream ended");
+
+ ms.Write (bytes, 0, x);
+ slen -= x;
+ }
+ ms.Seek (0, SeekOrigin.Begin);
+ return ms;