annotate Util/InteropUtil.cs @ 76:b05350c24596

Added InteropUtil for safe pinned array and string access
author Ivo Smits <Ivo@UCIS.nl>
date Mon, 03 Feb 2014 22:53:58 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
76
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Text;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.IO;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Runtime.InteropServices;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 namespace UCIS.Util {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 public class PinnedObject : SafeHandle {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 GCHandle gch;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 public PinnedObject(Object obj)
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 : base(IntPtr.Zero, true) {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 gch = GCHandle.Alloc(obj, GCHandleType.Pinned);
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 SetHandle(gch.AddrOfPinnedObject());
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 public override bool IsInvalid { get { return handle == IntPtr.Zero; } }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 protected override bool ReleaseHandle() {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 if (gch.IsAllocated) {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 gch.Free();
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 return true;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 } else {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 return false;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 public static implicit operator IntPtr(PinnedObject p) { return p.DangerousGetHandle(); }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 public static implicit operator PinnedObject(Array o) { return new PinnedObject(o); }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 public class PinnedString : SafeHandle {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 public PinnedString(String str, Boolean unicode)
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 : base(IntPtr.Zero, true) {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 SetHandle(unicode ? Marshal.StringToHGlobalUni(str) : Marshal.StringToHGlobalAnsi(str));
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 public override bool IsInvalid { get { return handle == IntPtr.Zero; } }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 protected override bool ReleaseHandle() {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 Marshal.FreeHGlobal(handle);
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 return true;
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 public static implicit operator IntPtr(PinnedString p) { return p.DangerousGetHandle(); }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 public class PinnedStringAnsi : PinnedString {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 public PinnedStringAnsi(String str) : base(str, false) { }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 public static implicit operator PinnedStringAnsi(String s) { return new PinnedStringAnsi(s); }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 public class PinnedStringUni : PinnedString {
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 public PinnedStringUni(String str) : base(str, true) { }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 public static implicit operator PinnedStringUni(String s) { return new PinnedStringUni(s); }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 }
b05350c24596 Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 }