Added InterfaceProxy to Mono bindings to avoid having to generate a proxy for every...
authorOwen Fraser-Green <owen@discobabe.net>
Tue, 23 Mar 2004 18:07:48 +0000 (18:07 +0000)
committerOwen Fraser-Green <owen@discobabe.net>
Tue, 23 Mar 2004 18:07:48 +0000 (18:07 +0000)
ChangeLog
dbus/dbus-message.c
dbus/dbus-message.h
mono/Arguments.cs
mono/Handler.cs
mono/InterfaceProxy.cs [new file with mode: 0644]
mono/Introspector.cs
mono/Makefile.am
mono/Message.cs
mono/ProxyBuilder.cs
mono/Service.cs

index 30ae5ad..e9ccd38 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,26 @@
 2004-03-23  Owen Fraser-Green  <owen@discobabe.net>
 
-       First checkin of mono bindings.
+        * mono/Arguments.cs:
+       * mono/Introspector.cs:
+       * mono/Handler.cs:
+       * mono/InterfaceProxy.cs:
+       * mono/Message.cs
+       * mono/ProxyBuilder.cs:
+       * mono/Service.cs:
+       Added InterfaceProxy class to avoid building proxies for every
+       object.
+
+       * dbus-message.h:
+       * dbus-message.c (dbus_message_append_args_valist)
+       (dbus_message_iter_get_object_path)
+       (dbus_message_iter_get_object_path_array)
+       (dbus_message_iter_append_object_path)
+       (dbus_message_iter_append_object_path_array):
+       Added object_path iter functions to handle OBJECT_PATH arguments
+       
+2004-03-23  Owen Fraser-Green  <owen@discobabe.net>
 
+       First checkin of mono bindings.
        * configure.in:
        * Makefile.am:
        Build stuff for the bindings
index 6ae5a93..d56cd45 100644 (file)
@@ -1916,7 +1916,8 @@ dbus_message_append_args_valist (DBusMessage *message,
            goto errorout;
          break;
         case DBUS_TYPE_OBJECT_PATH:
-
+         if (!dbus_message_iter_append_object_path (&iter, va_arg (var_args, const char*)))
+           goto errorout;
           break;
        case DBUS_TYPE_CUSTOM:
          {
@@ -1977,6 +1978,10 @@ dbus_message_append_args_valist (DBusMessage *message,
                if (!dbus_message_iter_append_string_array (&iter, (const char **)data, len))
                  goto errorout;
                break;
+             case DBUS_TYPE_OBJECT_PATH:
+               if (!dbus_message_iter_append_object_path_array (&iter, (const char **)data, len))
+                 goto errorout;
+               break;
              case DBUS_TYPE_NIL:
              case DBUS_TYPE_ARRAY:
              case DBUS_TYPE_CUSTOM:
@@ -2664,7 +2669,6 @@ dbus_message_iter_get_string (DBusMessageIter *iter)
   int type, pos;
 
   _dbus_return_val_if_fail (dbus_message_iter_check (real), NULL);
-
   pos = dbus_message_iter_get_data_start (real, &type);
   
   _dbus_assert (type == DBUS_TYPE_STRING);
@@ -2673,11 +2677,7 @@ dbus_message_iter_get_string (DBusMessageIter *iter)
                                  pos, NULL);
 }
 
-#if 0
 /**
- * @todo FIXME to finish this _dbus_demarshal_object_path() needs
- * to not explode the path.
- * 
  * Returns the object path value that an iterator may point to.
  * Note that you need to check that the iterator points to
  * an object path value before using this function.
@@ -2698,10 +2698,9 @@ dbus_message_iter_get_object_path (DBusMessageIter  *iter)
   
   _dbus_assert (type == DBUS_TYPE_OBJECT_PATH);
 
-  return _dbus_demarshal_object_path (&real->message->body, real->message->byte_order,
-                                      pos, NULL);
+  return _dbus_demarshal_string (&real->message->body, real->message->byte_order,
+                                 pos, NULL);
 }
-#endif
 
 /**
  * Returns the name and data from a custom type that an iterator may
@@ -3325,11 +3324,7 @@ dbus_message_iter_get_string_array (DBusMessageIter *iter,
     return TRUE;
 }
 
-#if 0
 /**
- * @todo FIXME to implement this _dbus_demarshal_object_path_array()
- * needs implementing
- * 
  * Returns the object path array that the iterator may point to.
  * Note that you need to check that the iterator points
  * to an object path array prior to using this function.
@@ -3361,13 +3356,12 @@ dbus_message_iter_get_object_path_array (DBusMessageIter *iter,
   type = iter_get_array_type (real, NULL);
   _dbus_assert (type == DBUS_TYPE_OBJECT_PATH);
 
-  if (!_dbus_demarshal_object_path_array (&real->message->body, real->message->byte_order,
-                                          pos, NULL, value, len))
+  if (!_dbus_demarshal_string_array (&real->message->body, real->message->byte_order,
+                                    pos, NULL, value, len))
     return FALSE;
   else
     return TRUE;
 }
-#endif
 
 /**
  * Returns the key name fot the dict entry that an iterator
@@ -3800,6 +3794,37 @@ dbus_message_iter_append_string (DBusMessageIter *iter,
 }
 
 /**
+ * Appends an object path to the message.
+ *
+ * @todo add return_val_if_fail(UTF-8 is valid)
+ *
+ * @param iter an iterator pointing to the end of the message
+ * @param value the object path
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+dbus_message_iter_append_object_path (DBusMessageIter *iter,
+                                     const char      *value)
+{
+  DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
+
+  _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
+  
+  if (!dbus_message_iter_append_type (real, DBUS_TYPE_OBJECT_PATH))
+    return FALSE;
+  
+  if (!_dbus_marshal_string (&real->message->body, real->message->byte_order, value))
+    {
+      _dbus_string_set_length (&real->message->body, real->pos);
+      return FALSE;
+    }
+
+  dbus_message_iter_append_done (real);
+  
+  return TRUE;
+}
+
+/**
  * Appends a custom type data chunk to the message. A custom
  * type is simply an arbitrary UTF-8 string used as a type
  * tag, plus an array of arbitrary bytes to be interpreted
@@ -4331,6 +4356,37 @@ dbus_message_iter_append_string_array (DBusMessageIter *iter,
 }
 
 /**
+ * Appends an object path array to the message.
+ *
+ * @param iter an iterator pointing to the end of the message
+ * @param value the array
+ * @param len the length of the array
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+dbus_message_iter_append_object_path_array (DBusMessageIter *iter,
+                                           const char     **value,
+                                           int              len)
+{
+  DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
+
+  _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
+
+  if (!append_array_type (real, DBUS_TYPE_OBJECT_PATH, NULL, NULL))
+    return FALSE;
+  
+  if (!_dbus_marshal_string_array (&real->message->body, real->message->byte_order, value, len))
+    {
+      _dbus_string_set_length (&real->message->body, real->pos);
+      return FALSE;
+    }
+
+  dbus_message_iter_append_done (real);
+  
+  return TRUE;
+}
+
+/**
  * Sets the message sender.
  *
  * @param message the message
index 02fa181..5167669 100644 (file)
@@ -230,6 +230,8 @@ dbus_bool_t dbus_message_iter_append_double        (DBusMessageIter      *iter,
                                                    double                value);
 dbus_bool_t dbus_message_iter_append_string        (DBusMessageIter      *iter,
                                                    const char           *value);
+dbus_bool_t dbus_message_iter_append_object_path   (DBusMessageIter      *iter,
+                                                   const char           *value);
 dbus_bool_t dbus_message_iter_append_custom        (DBusMessageIter      *iter,
                                                    const char           *name,
                                                    const unsigned char  *data,
@@ -269,6 +271,9 @@ dbus_bool_t dbus_message_iter_append_byte_array    (DBusMessageIter      *iter,
 dbus_bool_t dbus_message_iter_append_string_array  (DBusMessageIter      *iter,
                                                    const char          **value,
                                                    int                   len);
+dbus_bool_t dbus_message_iter_append_object_path_array (DBusMessageIter      *iter,
+                                                       const char          **value,
+                                                       int                   len);
 
 
 
index ac88d6a..0df205c 100644 (file)
@@ -170,22 +170,6 @@ namespace DBus
       return constructor;
     }
 
-    // Get the signature of a method
-    public static string ParseParameters(MethodInfo method) 
-    {
-      ParameterInfo[] pars = method.GetParameters();
-      string key = "";
-      foreach (ParameterInfo par in pars) {
-       if (!par.IsOut) {
-         Type dbusType = MatchType(par.ParameterType);
-         key += GetCode(dbusType);
-       }
-      }
-
-      return key;
-    } 
-
     // Get the type code for a given D-BUS type
     public static char GetCode(Type dbusType) 
     {
index d565b7e..a854c9c 100644 (file)
@@ -12,7 +12,6 @@ namespace DBus
     private string pathName = null;
     private Introspector introspector = null;
     private object handledObject = null;
-    private Hashtable handledMethods = null;
     private DBusObjectPathVTable vTable;
     private Connection connection;
     private Service service;
@@ -99,33 +98,20 @@ namespace DBus
        throw new OutOfMemoryException();
     }
 
-    private void RegisterMethod(MethodInfo method) 
-    {
-      string key = method.Name + " " + Arguments.ParseParameters(method);
-      handledMethods.Add(key, method);
-    }
-
     public object HandledObject 
     {
-      get 
-       {
-         return this.handledObject;
-       }
+      get {
+       return this.handledObject;
+      }
       
-      set
-       {
-         this.handledObject = value;
-
-         object[] attributes;
-
-         // Register the methods
-         this.handledMethods = new Hashtable();
-         this.introspector = new Introspector(value.GetType());
-         
-         foreach (MethodInfo method in this.introspector.Methods) {
-           RegisterMethod(method);
-         }  
-       }
+      set {
+       this.handledObject = value;
+       
+       object[] attributes;
+       
+       // Register the methods
+       this.introspector = Introspector.GetIntrospector(value.GetType());        
+      }
     }
     
     public int Filter_Called(IntPtr rawConnection,
@@ -169,22 +155,14 @@ namespace DBus
     private Result HandleMethod(MethodCall methodCall)
     {
       methodCall.Service = service;
-
-      // Check the interface name matches
-      if (methodCall.InterfaceName != this.introspector.InterfaceName) {
-       return Result.NotYetHandled;
-      }
-
-      // Iterate through getting the type codes
-      string key = methodCall.Name + " " + methodCall.Arguments;
-
-      // Check it's one of our methods
-      if (!handledMethods.Contains(key)) {
+      
+      InterfaceProxy interfaceProxy = this.introspector.GetInterface(methodCall.InterfaceName);
+      if (interfaceProxy == null || !interfaceProxy.HasMethod(methodCall.Key)) {
+       // No such interface here.
        return Result.NotYetHandled;
       }
-
-      // Got it!
-      MethodInfo method = (MethodInfo) handledMethods[key];
+      
+      MethodInfo method = interfaceProxy.GetMethod(methodCall.Key);
 
       // Now call the method. FIXME: Error handling
       object [] args = methodCall.Arguments.GetParameters(method);
diff --git a/mono/InterfaceProxy.cs b/mono/InterfaceProxy.cs
new file mode 100644 (file)
index 0000000..6ccc963
--- /dev/null
@@ -0,0 +1,86 @@
+namespace DBus
+{
+  using System;
+  using System.Collections;
+  using System.Reflection;
+  
+  internal class InterfaceProxy
+  {
+    private static Hashtable interfaceProxies = new Hashtable();
+    private Hashtable methods = null;
+
+    private string interfaceName;
+
+    private InterfaceProxy(Type type) 
+    {
+      object[] attributes = type.GetCustomAttributes(typeof(InterfaceAttribute), true);
+      InterfaceAttribute interfaceAttribute = (InterfaceAttribute) attributes[0];
+      this.interfaceName = interfaceAttribute.InterfaceName;
+      AddMethods(type);
+    }
+
+    private void AddMethods(Type type)
+    {
+      this.methods = new Hashtable();
+      foreach (MethodInfo method in type.GetMethods(BindingFlags.Public | 
+                                                   BindingFlags.Instance | 
+                                                   BindingFlags.DeclaredOnly)) {
+       object[] attributes = method.GetCustomAttributes(typeof(MethodAttribute), true);
+       if (attributes.GetLength(0) > 0) {
+         methods.Add(GetKey(method), method);
+       }
+      }
+    }
+    
+
+    public static InterfaceProxy GetInterface(Type type) 
+    {
+      if (!interfaceProxies.Contains(type)) {
+       interfaceProxies[type] = new InterfaceProxy(type);
+      }
+
+      return (InterfaceProxy) interfaceProxies[type];
+    }
+
+    public bool HasMethod(string key) 
+    {
+      return this.Methods.Contains(key);
+    }
+    
+    public MethodInfo GetMethod(string key)
+    {
+      return (MethodInfo) this.Methods[key];
+    }
+
+    private string GetKey(MethodInfo method) 
+    {
+      ParameterInfo[] pars = method.GetParameters();
+      string key = method.Name + " ";
+      
+      foreach (ParameterInfo par in pars) {
+       if (!par.IsOut) {
+         Type dbusType = Arguments.MatchType(par.ParameterType);
+         key += Arguments.GetCode(dbusType);
+       }
+      }
+
+      return key;
+    }
+
+    public Hashtable Methods
+    {
+      get {
+       return this.methods;
+      }
+    }
+    
+    public string InterfaceName
+    {
+      get {
+       return this.interfaceName;
+      }
+    }
+  }
+}
+
+    
index c7b9d05..8e97abc 100644 (file)
@@ -10,97 +10,72 @@ namespace DBus
   internal class Introspector
   {
     private Type type;
-    private string interfaceName;
+    private static Hashtable introspectors = new Hashtable();
+    private Hashtable interfaceProxies = null;
     
-    public Introspector(Type type)    {
-      object[] attributes = type.GetCustomAttributes(typeof(InterfaceAttribute), true);
-      if (attributes.Length != 1)
-       throw new ApplicationException("Type '" + type + "' is not a D-BUS interface.");
-      
-      InterfaceAttribute interfaceAttribute = (InterfaceAttribute) attributes[0];
-     
-      this.interfaceName = interfaceAttribute.InterfaceName;
+    public static Introspector GetIntrospector(Type type) 
+    {
+      if (!introspectors.Contains(type)) {
+       introspectors[type] = new Introspector(type);
+      }
+
+      return (Introspector) introspectors[type];
+    }
+
+    private Introspector(Type type) 
+    {
+      interfaceProxies = new Hashtable();
+      AddType(type);
       this.type = type;
     }
     
-    public string InterfaceName
+    private void AddType(Type type) 
     {
-      get
-       {
-         return this.interfaceName;
-       }
+      if (type == typeof(object)) {
+       // Base case
+       return;
+      }
+
+      object[] attributes = type.GetCustomAttributes(typeof(InterfaceAttribute), false);
+      if (attributes.Length >= 1) {
+       // This is a D-BUS interface so add it to the hashtable
+       InterfaceProxy interfaceProxy = InterfaceProxy.GetInterface(type);
+       interfaceProxies.Add(interfaceProxy.InterfaceName, interfaceProxy);
+      }
+
+      AddType(type.BaseType);
+    }
+    
+    public InterfaceProxy GetInterface(string interfaceName) {
+      if (interfaceProxies.Contains(interfaceName)) {
+       return (InterfaceProxy) interfaceProxies[interfaceName];
+      } else {
+       return null;
+      }
     }
 
-    public ConstructorInfo Constructor
+    public Hashtable InterfaceProxies
     {
-      get
-       {
-         ConstructorInfo ret = this.type.GetConstructor(new Type[0]);
-         if (ret != null) {
-           return ret;
-         } else {
-           return typeof(object).GetConstructor(new Type[0]);
-         }
-       }
+      get {
+       return this.interfaceProxies;
+      }
     }
 
-    public IntrospectorMethods Methods
+    public ConstructorInfo Constructor
     {
-      get
-       {
-         return new IntrospectorMethods(this.type);
+      get {
+       ConstructorInfo ret = this.type.GetConstructor(new Type[0]);
+       if (ret != null) {
+         return ret;
+       } else {
+         return typeof(object).GetConstructor(new Type[0]);
        }
+      }
     }
 
-    public class IntrospectorMethods : IEnumerable
+    public override string ToString()
     {
-      private Type type;
-      
-      public IntrospectorMethods(Type type)
-      {
-       this.type = type;
-      }
-
-      public IEnumerator GetEnumerator()
-      {
-       return new MethodEnumerator(this.type.GetMethods(BindingFlags.Public|BindingFlags.Instance).GetEnumerator());
-      }
-
-      private class MethodEnumerator : IEnumerator
-      {
-       private IEnumerator enumerator;
-       
-       public MethodEnumerator(IEnumerator enumerator)
-       {
-         this.enumerator = enumerator;
-       }
-       
-       public bool MoveNext()
-       {
-         while (enumerator.MoveNext()) {
-           MethodInfo method = (MethodInfo) enumerator.Current;
-           object[] attributes = method.GetCustomAttributes(typeof(MethodAttribute), true);
-           if (attributes.GetLength(0) > 0) {
-             return true;
-           }
-         }
-         
-         return false;
-       }
-       
-       public void Reset()
-       {
-         enumerator.Reset();
-       }
-       
-       public object Current
-       {
-         get
-           {
-             return enumerator.Current;
-           }
-       }
-      }
+      return this.type.ToString();
     }
   }
 }
index 6483f4e..b35a5c4 100644 (file)
@@ -12,6 +12,7 @@ DBUS_SHARP_FILES=             \
        Error.cs                \
        Handler.cs              \
        InterfaceAttribute.cs   \
+       InterfaceProxy.cs       \
        Introspector.cs         \
        Message.cs              \
        MethodAttribute.cs      \
index 2f5270d..a1ff220 100644 (file)
@@ -35,6 +35,7 @@ namespace DBus
     protected string pathName = null;
     protected string interfaceName = null;
     protected string name = null;    
+    private string key= null;
 
     protected Message()
     {
@@ -263,6 +264,17 @@ namespace DBus
        }
     }
 
+    public string Key
+    {
+      get {
+       if (this.key == null) {
+         this.key = Name + " " + Arguments;
+       }
+       
+       return this.key;
+      }
+    }
+
     public Arguments Arguments
     {
       get 
index 8e170c7..06bdeec 100644 (file)
@@ -50,13 +50,13 @@ namespace DBus
       this.service = service;
       this.pathName = pathName;
       this.type = type;
-      this.introspector = new Introspector(type);
+      this.introspector = Introspector.GetIntrospector(type);
     }
 
     private void BuildMethod(MethodInfo method, 
+                            InterfaceProxy interfaceProxy,
                             ref TypeBuilder typeB, 
                             FieldInfo serviceF,
-                            FieldInfo interfaceF,
                             FieldInfo pathF)
     {
       ParameterInfo[] pars = method.GetParameters();
@@ -95,7 +95,7 @@ namespace DBus
       generator.Emit(OpCodes.Ldsfld, serviceF);
       generator.Emit(OpCodes.Ldarg_0);
       generator.Emit(OpCodes.Ldfld, pathF);
-      generator.Emit(OpCodes.Ldsfld, interfaceF);
+      generator.Emit(OpCodes.Ldstr, interfaceProxy.InterfaceName);
       generator.Emit(OpCodes.Ldstr, method.Name);
       generator.Emit(OpCodes.Newobj, MethodCall_C);
       generator.Emit(OpCodes.Stloc_0);
@@ -190,9 +190,9 @@ namespace DBus
       }
     }
     
-    public void BuildConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo interfaceF, FieldInfo pathF)
+    public void BuildConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF)
     {
-      Type[] pars = {typeof(Service), typeof(string), typeof(string)};
+      Type[] pars = {typeof(Service), typeof(string)};
       ConstructorBuilder constructor = typeB.DefineConstructor(MethodAttributes.RTSpecialName | 
                                                               MethodAttributes.Public,
                                                               CallingConventions.Standard, pars);
@@ -202,10 +202,8 @@ namespace DBus
       generator.Emit(OpCodes.Call, this.introspector.Constructor);
       generator.Emit(OpCodes.Ldarg_1);
       generator.Emit(OpCodes.Stsfld, serviceF);
-      generator.Emit(OpCodes.Ldarg_2);
-      generator.Emit(OpCodes.Stsfld, interfaceF);
       generator.Emit(OpCodes.Ldarg_0);
-      generator.Emit(OpCodes.Ldarg_3);
+      generator.Emit(OpCodes.Ldarg_2);
       generator.Emit(OpCodes.Stfld, pathF);
 
       generator.Emit(OpCodes.Ret);
@@ -216,29 +214,28 @@ namespace DBus
       
       // Build the type
       TypeBuilder typeB = ServiceModuleBuilder.DefineType(ProxyName, TypeAttributes.Public, this.type);
-      //type.AddInterfaceImplementation(typeof(IProxy));
       
       FieldBuilder serviceF = typeB.DefineField("service", 
                                                typeof(Service), 
                                                FieldAttributes.Private | 
                                                FieldAttributes.Static);
-      FieldBuilder interfaceF = typeB.DefineField("interfaceName", 
-                                                 typeof(string), 
-                                                 FieldAttributes.Private | 
-                                                 FieldAttributes.Static);
       FieldBuilder pathF = typeB.DefineField("pathName", 
                                             typeof(string), 
                                             FieldAttributes.Private);
 
-      BuildConstructor(ref typeB, serviceF, interfaceF, pathF);
+      BuildConstructor(ref typeB, serviceF, pathF);
 
       // Build the methods
-      foreach (MethodInfo method in this.introspector.Methods) {
-       BuildMethod(method, ref typeB, serviceF, interfaceF, pathF);
+      foreach (DictionaryEntry interfaceEntry in this.introspector.InterfaceProxies) {
+       InterfaceProxy interfaceProxy = (InterfaceProxy) interfaceEntry.Value;
+       foreach (DictionaryEntry methodEntry in interfaceProxy.Methods) {
+         MethodInfo method = (MethodInfo) methodEntry.Value;
+         BuildMethod(method, interfaceProxy, ref typeB, serviceF, pathF);
+       }
       }
       
-      Type [] parTypes = new Type[] {typeof(Service), typeof(string), typeof(string)};
-      object [] pars = new object[] {Service, this.introspector.InterfaceName, pathName};
+      Type [] parTypes = new Type[] {typeof(Service), typeof(string)};
+      object [] pars = new object[] {Service, pathName};
       
       Type proxyType = typeB.CreateType();
 
@@ -247,7 +244,7 @@ namespace DBus
       // monodis. Note that in order for this to work you should copy
       // the client assembly as a dll file so that monodis can pick it
       // up.
-      //ProxyAssembly.Save("proxy.dll");
+      ProxyAssembly.Save("proxy.dll");
 
       ConstructorInfo constructor = proxyType.GetConstructor(parTypes);
       object instance = constructor.Invoke(pars);
@@ -256,45 +253,41 @@ namespace DBus
 
     private ModuleBuilder ServiceModuleBuilder
     {
-      get
-       {
-         if (Service.module == null) {
-           Service.module = ProxyAssembly.DefineDynamicModule(Service.Name, "proxy.dll", true);
-         }
-         
-         return Service.module;
+      get {
+       if (Service.module == null) {
+         Service.module = ProxyAssembly.DefineDynamicModule(Service.Name, "proxy.dll", true);
        }
+       
+       return Service.module;
+      }
     }
   
   private Service Service
     {
-      get
-       {
-         return this.service;
-       }
+      get {
+       return this.service;
+      }
     }
 
     private string ProxyName
     {
-      get
-       {
-         return this.introspector.InterfaceName + ".Proxy";
-       }
+      get {
+       return this.introspector.ToString() + ".Proxy";
+      }
     }
 
     private AssemblyBuilder ProxyAssembly
     {
-      get
-       {
-         if (this.proxyAssembly == null){
-           AssemblyName assemblyName = new AssemblyName();
-           assemblyName.Name = "DBusProxy";
-           this.proxyAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, 
-                                                                         AssemblyBuilderAccess.RunAndSave);
-         }
-         
-         return this.proxyAssembly;
+      get {
+       if (this.proxyAssembly == null){
+         AssemblyName assemblyName = new AssemblyName();
+         assemblyName.Name = "DBusProxy";
+         this.proxyAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, 
+                                                                       AssemblyBuilderAccess.RunAndSave);
        }
+       
+       return this.proxyAssembly;
+      }
     }
   }
 }
index a3c2a31..39dd4f4 100644 (file)
@@ -68,8 +68,8 @@ namespace DBus
                               string pathName) 
     {
       Handler handler = new Handler(handledObject, 
-                                           pathName, 
-                                           this);
+                                   pathName, 
+                                   this);
       registeredHandlers.Add(handledObject, handler);
     }