Imported Upstream version 4.6.0.125

Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2016-08-03 10:59:49 +00:00
parent a569aebcfd
commit e79aa3c0ed
17047 changed files with 3137615 additions and 392334 deletions

View File

@ -63,6 +63,9 @@ namespace System
#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);
@ -71,10 +74,13 @@ namespace System
~__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 ()
@ -86,14 +92,22 @@ namespace System
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 ();
@ -101,8 +115,14 @@ namespace System
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);
@ -113,6 +133,8 @@ namespace System
int hr = CoCreateInstance (GetCLSID (t), IntPtr.Zero, 0x1 | 0x4 | 0x10, IID_IUnknown, out iunknown);
Marshal.ThrowExceptionForHR (hr);
}
return iunknown;
}
private void InitializeApartmentDetails ()
@ -230,4 +252,16 @@ namespace System
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