#endregion
#pragma warning restore 169
+ // keep a reference to the proxy so it doesn't get garbage collected before the RCW
+ ComInteropProxy proxy;
+
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern __ComObject CreateRCW (Type t);
~__ComObject ()
{
- if (synchronization_context != null)
- synchronization_context.Post ((state) => ReleaseInterfaces (), this);
- else
- ReleaseInterfaces ();
+ if (hash_table != IntPtr.Zero) {
+ if (synchronization_context != null)
+ synchronization_context.Post ((state) => ReleaseInterfaces (), this);
+ else
+ ReleaseInterfaces ();
+ }
+ proxy = null;
}
public __ComObject ()
Initialize (t);
}
- internal __ComObject (IntPtr pItf)
+ internal __ComObject (IntPtr pItf, ComInteropProxy p)
{
+ proxy = p;
InitializeApartmentDetails ();
Guid iid = IID_IUnknown;
int hr = Marshal.QueryInterface (pItf, ref iid, out iunknown);
Marshal.ThrowExceptionForHR (hr);
}
+ internal void Initialize (IntPtr pUnk, ComInteropProxy p)
+ {
+ proxy = p;
+ InitializeApartmentDetails ();
+ iunknown = pUnk;
+ }
+
internal void Initialize (Type t)
{
InitializeApartmentDetails ();
if (iunknown != IntPtr.Zero)
return;
+ iunknown = CreateIUnknown (t);
+ }
+
+ internal static IntPtr CreateIUnknown(Type t)
+ {
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (t.TypeHandle);
-
+
+ IntPtr iunknown;
ObjectCreationDelegate ocd = ExtensibleClassFactory.GetObjectCreationCallback (t);
if (ocd != null) {
iunknown = ocd (IntPtr.Zero);
int hr = CoCreateInstance (GetCLSID (t), IntPtr.Zero, 0x1 | 0x4 | 0x10, IID_IUnknown, out iunknown);
Marshal.ThrowExceptionForHR (hr);
}
+
+ return iunknown;
}
private void InitializeApartmentDetails ()
out IntPtr pUnk);
}
}
+#else
+namespace System
+{
+ // this is a shim class so we can AOT during mobile_static build without --enable-minimal=com
+ internal class __ComObject
+ {
+ __ComObject ()
+ {
+ throw new NotSupportedException ();
+ }
+ }
+}
#endif