On 01/06/06 Jonathan S. Chambers wrote:
> Here the patch for the class libs.

> Index: class/corlib/System/ComProxy.cs
> ===================================================================
> --- mcs/class/corlib/System/ComProxy.cs       (revision 0)
> +++ mcs/class/corlib/System/ComProxy.cs       (revision 0)
[...]
> +namespace System
> +{
> +    internal class ComProxy : System.Runtime.Remoting.Proxies.RealProxy, 
> System.Runtime.Remoting.IRemotingTypeInfo
> +    {
> +        #region Sync with object-internals.h
> +        private IntPtr _com_object;
> +        private string _typeName;
> +        #endregion

Please use TAB characters to indent the source code, not spaces.

> Index: mcs/class/corlib/System/__ComObject.cs
> ===================================================================
> --- mcs/class/corlib/System/__ComObject.cs    (revision 55123)
> +++ mcs/class/corlib/System/__ComObject.cs    (working copy)
> @@ -32,21 +32,106 @@
>  
>  namespace System
>  {
> -     // This is a private class that is used as a generic wrapper class
> -     // for COM objects that have no specific wrapper class.
> -     //
> -     // It has no public methods, it's functionality is exposed trough
> -     // System.Runtime.InteropServices.Marshal class and can be casted to
> -     // any interface that is implemented by the wrapped COM object.
> -     //
> -     // This class is referenced in .NET Framework SDK Documentation so
> -     // many times that obj.GetType().FullName == "System.__ComObject" and
> -     // Type.GetType("System.__ComObject") may be used.
> +    using System.Runtime.InteropServices;
> +    // This is a private class that is used as a generic wrapper class
> +    // for COM objects that have no specific wrapper class.
> +    //
> +    // It has no public methods, it's functionality is exposed trough
> +    // System.Runtime.InteropServices.Marshal class and can be casted to
> +    // any interface that is implemented by the wrapped COM object.
> +    //
> +    // This class is referenced in .NET Framework SDK Documentation so
> +    // many times that obj.GetType().FullName == "System.__ComObject" and
> +    // Type.GetType("System.__ComObject") may be used.
>  
> -     internal class __ComObject : MarshalByRefObject
> -     {
> -             private __ComObject ()
> -             {
> -             }
> -     }
> +    internal class __ComObject : MarshalByRefObject
> +    {
> +        private IntPtr _iunk;
> +        private __ComObject()
> +        {
> +        }
> +    }

Please, put back the correct indentation with TABs.

> +        public static int AddRef(IntPtr pUnk)
> +        {
> +            IntPtr vtable = Marshal.ReadIntPtr(pUnk);
> +            IntPtr qi = Marshal.ReadIntPtr(vtable);
> +            // QueryInterface is 2st method
> +            IntPtr pAddRef = (IntPtr)(qi.ToInt64() + IntPtr.Size);
> +            AddRefDelegate add_ref = 
> (AddRefDelegate)Marshal.GetDelegateForFunctionPointer(pAddRef, 
> typeof(AddRefDelegate));
> +            return add_ref(pUnk);
> +        }

Moving code to the managed side is sometimes the best way to implement
some things: this method is the proof that sometimes it's an orrible
idea:-) This stuff shuld be done in the C runtime.

> -                     throw new NotImplementedException ();
> +            object [] attrs = 
> t.GetCustomAttributes(typeof(System.Runtime.InteropServices.InterfaceTypeAttribute),
>  false);
> +            if (attrs == null || attrs.Length == 0)

Use Attribute.IsDefined ().

> +        public static int QueryInterface(IntPtr pUnk, ref Guid iid, out 
> IntPtr ppv)
> +        {
> +            IntPtr vtable = Marshal.ReadIntPtr(pUnk);
> +            IntPtr qi = Marshal.ReadIntPtr(vtable);
> +            // QueryInterface is 1st method
> +            QueryInterfaceDelegate query_interface = 
> (QueryInterfaceDelegate)Marshal.GetDelegateForFunctionPointer(qi, 
> typeof(QueryInterfaceDelegate));
> +            return query_interface(pUnk, ref iid, out ppv);
> +        }

Move to unmanaged.

> +        public static int Release(IntPtr pUnk)
> +        {
> +            Console.WriteLine("In Marshal.Release pUnk = {0}", pUnk);
> +            IntPtr vtable = Marshal.ReadIntPtr(pUnk);
> +            Console.WriteLine("In Marshal.Release 1");
> +            IntPtr qi = Marshal.ReadIntPtr((IntPtr)(vtable.ToInt64() + 2 * 
> IntPtr.Size));
> +            Console.WriteLine("In Marshal.Release 2");
> +            // QueryInterface is 3rd method
> +            IntPtr pRelease = qi;//(IntPtr)(qi.ToInt64() + 2 * IntPtr.Size);
> +            Console.WriteLine("In Marshal.Release 3");
> +            ReleaseDelegate release = 
> (ReleaseDelegate)Marshal.GetDelegateForFunctionPointer(pRelease, 
> typeof(ReleaseDelegate));
> +            Console.WriteLine("In Marshal.Release 4");
> +            int count = release(pUnk);
> +            Console.WriteLine("In Marshal.Release 5 count = {0}", count);
> +            return count;
> +        }

Idem.

> Index: 
> mcs/class/corlib/System.Runtime.InteropServices/UnmanagedFunctionPointerAttribute.cs
> ===================================================================
> --- 
> mcs/class/corlib/System.Runtime.InteropServices/UnmanagedFunctionPointerAttribute.cs
>       (revision 55123)
> +++ 
> mcs/class/corlib/System.Runtime.InteropServices/UnmanagedFunctionPointerAttribute.cs
>       (working copy)
> @@ -26,14 +26,18 @@
>  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>  //
>  
> -#if NET_2_0
>  
>  using System;
>  
>  namespace System.Runtime.InteropServices {
>  
>       [AttributeUsage (AttributeTargets.Delegate, Inherited = false)]
> +    
> +#if NET_2_0
>       public sealed class UnmanagedFunctionPointerAttribute: Attribute {
> +#else
> +    internal sealed class UnmanagedFunctionPointerAttribute : Attribute {
> +#endif

Put only public/internal inside the ifdef, but I guess you won't neede
this after properly moving some things to the unmanaged world.

> Index: mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs
> ===================================================================
> --- mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs     
> (revision 55123)
> +++ mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs     
> (working copy)
> @@ -58,11 +58,10 @@
>               MarshalByRefObject _server;
>               int _targetDomainId = -1;
>               internal string _targetUri;
> -             #endregion
> -             
>               internal Identity _objectIdentity;
>               Object _objTP;
> -             object _stubData;
> +        object _stubData;
> +        #endregion

Please fix the indentation.

Thanks!

lupus

-- 
-----------------------------------------------------------------
[EMAIL PROTECTED]                                     debian/rules
[EMAIL PROTECTED]                             Monkeys do it better
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to