diff options
Diffstat (limited to 'mono/ProxyBuilder.cs')
-rw-r--r-- | mono/ProxyBuilder.cs | 608 |
1 files changed, 0 insertions, 608 deletions
diff --git a/mono/ProxyBuilder.cs b/mono/ProxyBuilder.cs deleted file mode 100644 index 7a3de959..00000000 --- a/mono/ProxyBuilder.cs +++ /dev/null @@ -1,608 +0,0 @@ -namespace DBus -{ - using System; - using System.Runtime.InteropServices; - using System.Diagnostics; - using System.Collections; - using System.Threading; - using System.Reflection; - using System.Reflection.Emit; - - internal class ProxyBuilder - { - private Service service= null; - private string pathName = null; - private Type type = null; - private Introspector introspector = null; - - private static MethodInfo Service_NameMI = typeof(Service).GetMethod("get_Name", - new Type[0]); - private static MethodInfo Service_ConnectionMI = typeof(Service).GetMethod("get_Connection", - new Type[0]); - private static MethodInfo Service_AddSignalCalledMI = typeof(Service).GetMethod("add_SignalCalled", - new Type[] {typeof(Service.SignalCalledHandler)}); - private static MethodInfo Service_RemoveSignalCalledMI = typeof(Service).GetMethod("remove_SignalCalled", - new Type[] {typeof(Service.SignalCalledHandler)}); - private static MethodInfo Signal_PathNameMI = typeof(Signal).GetMethod("get_PathName", - new Type[0]); - private static MethodInfo Message_ArgumentsMI = typeof(Message).GetMethod("get_Arguments", - new Type[0]); - private static MethodInfo Message_KeyMI = typeof(Message).GetMethod("get_Key", - new Type[0]); - private static MethodInfo Arguments_InitAppendingMI = typeof(Arguments).GetMethod("InitAppending", - new Type[0]); - private static MethodInfo Arguments_AppendMI = typeof(Arguments).GetMethod("Append", - new Type[] {typeof(DBusType.IDBusType)}); - private static MethodInfo Message_SendWithReplyAndBlockMI = typeof(Message).GetMethod("SendWithReplyAndBlock", - new Type[0]); - private static MethodInfo Message_SendMI = typeof(Message).GetMethod("Send", - new Type[0]); - private static MethodInfo Message_DisposeMI = typeof(Message).GetMethod("Dispose", - new Type[0]); - private static MethodInfo Arguments_GetEnumeratorMI = typeof(Arguments).GetMethod("GetEnumerator", - new Type[0]); - private static MethodInfo IEnumerator_MoveNextMI = typeof(System.Collections.IEnumerator).GetMethod("MoveNext", - new Type[0]); - private static MethodInfo IEnumerator_CurrentMI = typeof(System.Collections.IEnumerator).GetMethod("get_Current", - new Type[0]); - private static MethodInfo Type_GetTypeFromHandleMI = typeof(System.Type).GetMethod("GetTypeFromHandle", - new Type[] {typeof(System.RuntimeTypeHandle)}); - private static MethodInfo IDBusType_GetMI = typeof(DBusType.IDBusType).GetMethod("Get", - new Type[] {typeof(System.Type)}); - private static ConstructorInfo MethodCall_C = typeof(MethodCall).GetConstructor(new Type[] {typeof(Service), - typeof(string), - typeof(string), - typeof(string)}); - private static ConstructorInfo Signal_C = typeof(Signal).GetConstructor(new Type[] {typeof(Service), - typeof(string), - typeof(string), - typeof(string)}); - private static ConstructorInfo Service_SignalCalledHandlerC = typeof(Service.SignalCalledHandler).GetConstructor(new Type[] {typeof(object), - typeof(System.IntPtr)}); - private static MethodInfo String_opEqualityMI = typeof(System.String).GetMethod("op_Equality", - new Type[] {typeof(string), - typeof(string)}); - private static MethodInfo MulticastDelegate_opInequalityMI = typeof(System.MulticastDelegate).GetMethod("op_Inequality", - new Type[] {typeof(System.MulticastDelegate), - typeof(System.MulticastDelegate)}); - - - public ProxyBuilder(Service service, Type type, string pathName) - { - this.service = service; - this.pathName = pathName; - this.type = type; - this.introspector = Introspector.GetIntrospector(type); - } - - private MethodInfo BuildSignalCalled(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF) - { - Type[] parTypes = {typeof(Signal)}; - MethodBuilder methodBuilder = typeB.DefineMethod("Service_SignalCalled", - MethodAttributes.Private | - MethodAttributes.HideBySig, - typeof(void), - parTypes); - - ILGenerator generator = methodBuilder.GetILGenerator(); - - LocalBuilder enumeratorL = generator.DeclareLocal(typeof(System.Collections.IEnumerator)); - enumeratorL.SetLocalSymInfo("enumerator"); - - Label wrongPath = generator.DefineLabel(); - //generator.EmitWriteLine("if (signal.PathName == pathName) {"); - generator.Emit(OpCodes.Ldarg_1); - generator.EmitCall(OpCodes.Callvirt, Signal_PathNameMI, null); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, pathF); - generator.EmitCall(OpCodes.Call, String_opEqualityMI, null); - generator.Emit(OpCodes.Brfalse, wrongPath); - - int localOffset = 1; - - foreach (DictionaryEntry interfaceEntry in this.introspector.InterfaceProxies) { - InterfaceProxy interfaceProxy = (InterfaceProxy) interfaceEntry.Value; - foreach (DictionaryEntry signalEntry in interfaceProxy.Signals) { - EventInfo eventE = (EventInfo) signalEntry.Value; - // This is really cheeky since we need to grab the event as a private field. - FieldInfo eventF = this.type.GetField(eventE.Name, - BindingFlags.NonPublic| - BindingFlags.Instance); - - MethodInfo eventHandler_InvokeMI = eventE.EventHandlerType.GetMethod("Invoke"); - - ParameterInfo[] pars = eventHandler_InvokeMI.GetParameters(); - parTypes = new Type[pars.Length]; - for (int parN = 0; parN < pars.Length; parN++) { - parTypes[parN] = pars[parN].ParameterType; - LocalBuilder parmL = generator.DeclareLocal(parTypes[parN]); - parmL.SetLocalSymInfo(pars[parN].Name); - } - - Label skip = generator.DefineLabel(); - //generator.EmitWriteLine(" if (SelectedIndexChanged != null) {"); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, eventF); - generator.Emit(OpCodes.Ldnull); - generator.EmitCall(OpCodes.Call, MulticastDelegate_opInequalityMI, null); - generator.Emit(OpCodes.Brfalse, skip); - - //generator.EmitWriteLine(" if (signal.Key == 'la i')"); - generator.Emit(OpCodes.Ldarg_1); - generator.EmitCall(OpCodes.Callvirt, Message_KeyMI, null); - generator.Emit(OpCodes.Ldstr, eventE.Name + " " + InterfaceProxy.GetSignature(eventHandler_InvokeMI)); - generator.EmitCall(OpCodes.Call, String_opEqualityMI, null); - generator.Emit(OpCodes.Brfalse, skip); - - //generator.EmitWriteLine("IEnumerator enumerator = signal.Arguments.GetEnumerator()"); - generator.Emit(OpCodes.Ldarg_1); - generator.EmitCall(OpCodes.Callvirt, Message_ArgumentsMI, null); - generator.EmitCall(OpCodes.Callvirt, Arguments_GetEnumeratorMI, null); - generator.Emit(OpCodes.Stloc_0); - - for (int parN = 0; parN < pars.Length; parN++) { - ParameterInfo par = pars[parN]; - if (!par.IsOut) { - EmitSignalIn(generator, par.ParameterType, parN + localOffset, serviceF); - } - } - - //generator.EmitWriteLine(" SelectedIndexChanged(selectedIndex)"); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, eventF); - for (int parN = 0; parN < pars.Length; parN++) { - generator.Emit(OpCodes.Ldloc_S, parN + localOffset); - } - - generator.EmitCall(OpCodes.Callvirt, eventHandler_InvokeMI, null); - - generator.MarkLabel(skip); - //generator.EmitWriteLine(" }"); - - localOffset += pars.Length; - } - } - - generator.MarkLabel(wrongPath); - //generator.EmitWriteLine("}"); - - //generator.EmitWriteLine("return"); - generator.Emit(OpCodes.Ret); - - return methodBuilder; - } - - private void BuildSignalHandler(EventInfo eventE, - InterfaceProxy interfaceProxy, - ref TypeBuilder typeB, - FieldInfo serviceF, - FieldInfo pathF) - { - MethodInfo eventHandler_InvokeMI = eventE.EventHandlerType.GetMethod("Invoke"); - ParameterInfo[] pars = eventHandler_InvokeMI.GetParameters(); - Type[] parTypes = new Type[pars.Length]; - for (int parN = 0; parN < pars.Length; parN++) { - parTypes[parN] = pars[parN].ParameterType; - } - - // Generate the code - MethodBuilder methodBuilder = typeB.DefineMethod("Proxy_" + eventE.Name, - MethodAttributes.Public | - MethodAttributes.HideBySig | - MethodAttributes.Virtual, - typeof(void), - parTypes); - ILGenerator generator = methodBuilder.GetILGenerator(); - - for (int parN = 0; parN < pars.Length; parN++) { - methodBuilder.DefineParameter(parN + 1, pars[parN].Attributes, pars[parN].Name); - } - - // Generate the locals - LocalBuilder methodCallL = generator.DeclareLocal(typeof(MethodCall)); - methodCallL.SetLocalSymInfo("signal"); - - //generator.EmitWriteLine("Signal signal = new Signal(...)"); - generator.Emit(OpCodes.Ldsfld, serviceF); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, pathF); - generator.Emit(OpCodes.Ldstr, interfaceProxy.InterfaceName); - generator.Emit(OpCodes.Ldstr, eventE.Name); - generator.Emit(OpCodes.Newobj, Signal_C); - generator.Emit(OpCodes.Stloc_0); - - //generator.EmitWriteLine("signal.Arguments.InitAppending()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_ArgumentsMI, null); - generator.EmitCall(OpCodes.Callvirt, Arguments_InitAppendingMI, null); - - for (int parN = 0; parN < pars.Length; parN++) { - ParameterInfo par = pars[parN]; - if (!par.IsOut) { - EmitIn(generator, par.ParameterType, parN, serviceF); - } - } - - //generator.EmitWriteLine("signal.Send()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_SendMI, null); - - //generator.EmitWriteLine("signal.Dispose()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_DisposeMI, null); - - //generator.EmitWriteLine("return"); - generator.Emit(OpCodes.Ret); - } - - private void BuildMethod(MethodInfo method, - InterfaceProxy interfaceProxy, - ref TypeBuilder typeB, - FieldInfo serviceF, - FieldInfo pathF) - { - ParameterInfo[] pars = method.GetParameters(); - Type[] parTypes = new Type[pars.Length]; - for (int parN = 0; parN < pars.Length; parN++) { - parTypes[parN] = pars[parN].ParameterType; - } - - // Generate the code - MethodBuilder methodBuilder = typeB.DefineMethod(method.Name, - MethodAttributes.Public | - MethodAttributes.HideBySig | - MethodAttributes.Virtual, - method.ReturnType, - parTypes); - ILGenerator generator = methodBuilder.GetILGenerator(); - - for (int parN = 0; parN < pars.Length; parN++) { - methodBuilder.DefineParameter(parN + 1, pars[parN].Attributes, pars[parN].Name); - } - - // Generate the locals - LocalBuilder methodCallL = generator.DeclareLocal(typeof(MethodCall)); - methodCallL.SetLocalSymInfo("methodCall"); - LocalBuilder replyL = generator.DeclareLocal(typeof(MethodReturn)); - replyL.SetLocalSymInfo("reply"); - LocalBuilder enumeratorL = generator.DeclareLocal(typeof(System.Collections.IEnumerator)); - enumeratorL.SetLocalSymInfo("enumerator"); - - if (method.ReturnType != typeof(void)) { - LocalBuilder retvalL = generator.DeclareLocal(method.ReturnType); - retvalL.SetLocalSymInfo("retval"); - } - - //generator.EmitWriteLine("MethodCall methodCall = new MethodCall(...)"); - generator.Emit(OpCodes.Ldsfld, serviceF); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldfld, pathF); - generator.Emit(OpCodes.Ldstr, interfaceProxy.InterfaceName); - generator.Emit(OpCodes.Ldstr, method.Name); - generator.Emit(OpCodes.Newobj, MethodCall_C); - generator.Emit(OpCodes.Stloc_0); - - //generator.EmitWriteLine("methodCall.Arguments.InitAppending()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_ArgumentsMI, null); - generator.EmitCall(OpCodes.Callvirt, Arguments_InitAppendingMI, null); - - for (int parN = 0; parN < pars.Length; parN++) { - ParameterInfo par = pars[parN]; - if (!par.IsOut) { - EmitIn(generator, par.ParameterType, parN, serviceF); - } - } - - //generator.EmitWriteLine("MethodReturn reply = methodCall.SendWithReplyAndBlock()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_SendWithReplyAndBlockMI, null); - generator.Emit(OpCodes.Stloc_1); - - //generator.EmitWriteLine("IEnumerator enumeartor = reply.Arguments.GetEnumerator()"); - generator.Emit(OpCodes.Ldloc_1); - generator.EmitCall(OpCodes.Callvirt, Message_ArgumentsMI, null); - generator.EmitCall(OpCodes.Callvirt, Arguments_GetEnumeratorMI, null); - generator.Emit(OpCodes.Stloc_2); - - // handle the return value - if (method.ReturnType != typeof(void)) { - EmitOut(generator, method.ReturnType, 0); - } - - for (int parN = 0; parN < pars.Length; parN++) { - ParameterInfo par = pars[parN]; - if (par.IsOut || par.ParameterType.ToString().EndsWith("&")) { - EmitOut(generator, par.ParameterType, parN); - } - } - - // Clean up after ourselves - //generator.EmitWriteLine("methodCall.Dispose()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_DisposeMI, null); - - //generator.EmitWriteLine("reply.Dispose()"); - generator.Emit(OpCodes.Ldloc_1); - generator.EmitCall(OpCodes.Callvirt, Message_DisposeMI, null); - - if (method.ReturnType != typeof(void)) { - generator.Emit(OpCodes.Ldloc_3); - } - - generator.Emit(OpCodes.Ret); - - // Generate the method - typeB.DefineMethodOverride(methodBuilder, method); - } - - private void EmitSignalIn(ILGenerator generator, Type parType, int parN, FieldInfo serviceF) - { - //generator.EmitWriteLine("enumerator.MoveNext()"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, IEnumerator_MoveNextMI, null); - - Type outParType = Arguments.MatchType(parType); - //generator.EmitWriteLine("int selectedIndex = (int) ((DBusType.IDBusType) enumerator.Current).Get(typeof(int))"); - generator.Emit(OpCodes.Pop); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, IEnumerator_CurrentMI, null); - generator.Emit(OpCodes.Castclass, typeof(DBusType.IDBusType)); - generator.Emit(OpCodes.Ldtoken, parType); - generator.EmitCall(OpCodes.Call, Type_GetTypeFromHandleMI, null); - generator.EmitCall(OpCodes.Callvirt, IDBusType_GetMI, null); - // Call the DBusType EmitMarshalOut to make it emit itself - object[] pars = new object[] {generator, parType, true}; - outParType.InvokeMember("EmitMarshalOut", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, pars, null); - generator.Emit(OpCodes.Stloc_S, parN); - } - - - private void EmitIn(ILGenerator generator, Type parType, int parN, FieldInfo serviceF) - { - Type inParType = Arguments.MatchType(parType); - //generator.EmitWriteLine("methodCall.Arguments.Append(...)"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Message_ArgumentsMI, null); - generator.Emit(OpCodes.Ldarg_S, parN + 1); - - // Call the DBusType EmitMarshalIn to make it emit itself - object[] pars = new object[] {generator, parType}; - inParType.InvokeMember("EmitMarshalIn", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, pars, null); - - generator.Emit(OpCodes.Ldsfld, serviceF); - generator.Emit(OpCodes.Newobj, Arguments.GetDBusTypeConstructor(inParType, parType)); - generator.EmitCall(OpCodes.Callvirt, Arguments_AppendMI, null); - } - - private void EmitOut(ILGenerator generator, Type parType, int parN) - { - Type outParType = Arguments.MatchType(parType); - //generator.EmitWriteLine("enumerator.MoveNext()"); - generator.Emit(OpCodes.Ldloc_2); - generator.EmitCall(OpCodes.Callvirt, IEnumerator_MoveNextMI, null); - - //generator.EmitWriteLine("return (" + parType + ") ((DBusType.IDBusType) enumerator.Current).Get(typeof(" + parType + "))"); - generator.Emit(OpCodes.Pop); - if (parN > 0) { - generator.Emit(OpCodes.Ldarg_S, parN + 1); - } - - generator.Emit(OpCodes.Ldloc_2); - generator.EmitCall(OpCodes.Callvirt, IEnumerator_CurrentMI, null); - generator.Emit(OpCodes.Castclass, typeof(DBusType.IDBusType)); - generator.Emit(OpCodes.Ldtoken, parType); - generator.EmitCall(OpCodes.Call, Type_GetTypeFromHandleMI, null); - generator.EmitCall(OpCodes.Callvirt, IDBusType_GetMI, null); - - // Call the DBusType EmitMarshalOut to make it emit itself - object[] pars = new object[] {generator, parType, parN == 0}; - outParType.InvokeMember("EmitMarshalOut", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, pars, null); - - if (parN == 0) { - generator.Emit(OpCodes.Stloc_3); - } - } - - public void BuildConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF, MethodInfo signalCalledMI, FieldInfo deleF) - { - Type[] pars = {typeof(Service), typeof(string)}; - ConstructorBuilder constructor = typeB.DefineConstructor(MethodAttributes.RTSpecialName | - MethodAttributes.Public, - CallingConventions.Standard, pars); - - ILGenerator generator = constructor.GetILGenerator(); - - LocalBuilder handlerL = generator.DeclareLocal (typeof (Service.SignalCalledHandler)); - handlerL.SetLocalSymInfo ("handler"); - - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Call, this.introspector.Constructor); - //generator.EmitWriteLine("service = myService"); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Stsfld, serviceF); - //generator.EmitWriteLine("this.pathName = pathName"); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_2); - generator.Emit(OpCodes.Stfld, pathF); - - //generator.EmitWriteLine("handler = new Service.SignalCalledHandler(Service_SignalCalled)"); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldftn, signalCalledMI); - generator.Emit(OpCodes.Newobj, Service_SignalCalledHandlerC); - generator.Emit(OpCodes.Stloc_0); - - //generator.EmitWriteLine("this.delegate_created = handler"); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldloc_0); - generator.Emit(OpCodes.Stfld, deleF); - - //generator.EmitWriteLine("myService.SignalCalled += handler"); - generator.Emit(OpCodes.Ldloc_0); - generator.EmitCall(OpCodes.Callvirt, Service_AddSignalCalledMI, null); - - //generator.EmitWriteLine("return"); - generator.Emit(OpCodes.Ret); - } - - public void BuildSignalConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF) - { - Type[] pars = {typeof(Service), typeof(string)}; - ConstructorBuilder constructor = typeB.DefineConstructor(MethodAttributes.RTSpecialName | - MethodAttributes.Public, - CallingConventions.Standard, pars); - - ILGenerator generator = constructor.GetILGenerator(); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Call, this.introspector.Constructor); - //generator.EmitWriteLine("service = myService"); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Stsfld, serviceF); - //generator.EmitWriteLine("this.pathName = pathName"); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_2); - generator.Emit(OpCodes.Stfld, pathF); - - //generator.EmitWriteLine("return"); - generator.Emit(OpCodes.Ret); - } - - public void BuildFinalizer (TypeBuilder tb, FieldInfo serviceF, FieldInfo deleF) - { - // Note that this is a *HORRIBLE* example of how to build a finalizer - // It doesn't use the try/finally to chain to Object::Finalize. However, - // because that is always going to be a nop, lets just ignore that here. - // If you are trying to find the right code, look at what mcs does ;-). - - MethodBuilder mb = tb.DefineMethod("Finalize", - MethodAttributes.Family | - MethodAttributes.HideBySig | - MethodAttributes.Virtual, - typeof (void), - new Type [0]); - ILGenerator generator = mb.GetILGenerator(); - - //generator.EmitWriteLine("this.service.SignalCalled -= this.delegate_created"); - generator.Emit (OpCodes.Ldarg_0); - generator.Emit (OpCodes.Ldfld, serviceF); - generator.Emit (OpCodes.Ldarg_0); - generator.Emit (OpCodes.Ldfld, deleF); - generator.EmitCall (OpCodes.Callvirt, Service_RemoveSignalCalledMI, null); - generator.Emit (OpCodes.Ret); - } - - public object GetSignalProxy() - { - Type proxyType = Service.ProxyAssembly.GetType(ObjectName + ".SignalProxy"); - - if (proxyType == null) { - // Build the type - TypeBuilder typeB = Service.Module.DefineType(ObjectName + ".SignalProxy", - TypeAttributes.Public, - this.type); - - FieldBuilder serviceF = typeB.DefineField("service", - typeof(Service), - FieldAttributes.Private | - FieldAttributes.Static); - FieldBuilder pathF = typeB.DefineField("pathName", - typeof(string), - FieldAttributes.Private); - - BuildSignalConstructor(ref typeB, serviceF, pathF); - - // Build the signal handlers - foreach (DictionaryEntry interfaceEntry in this.introspector.InterfaceProxies) { - InterfaceProxy interfaceProxy = (InterfaceProxy) interfaceEntry.Value; - foreach (DictionaryEntry signalEntry in interfaceProxy.Signals) { - EventInfo eventE = (EventInfo) signalEntry.Value; - BuildSignalHandler(eventE, interfaceProxy, ref typeB, serviceF, pathF); - } - } - - proxyType = typeB.CreateType(); - - // Uncomment the following line to produce a DLL of the - // constructed assembly which can then be examined using - // 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. - //Service.ProxyAssembly.Save("proxy.dll"); - } - - Type [] parTypes = new Type[] {typeof(Service), typeof(string)}; - object [] pars = new object[] {Service, pathName}; - - ConstructorInfo constructor = proxyType.GetConstructor(parTypes); - object instance = constructor.Invoke(pars); - return instance; - } - - - public object GetProxy() - { - Type proxyType = Service.ProxyAssembly.GetType(ObjectName + ".Proxy"); - - if (proxyType == null) { - // Build the type - TypeBuilder typeB = Service.Module.DefineType(ObjectName + ".Proxy", TypeAttributes.Public, this.type); - - FieldBuilder serviceF = typeB.DefineField("service", - typeof(Service), - FieldAttributes.Private | - FieldAttributes.Static); - FieldBuilder pathF = typeB.DefineField("pathName", - typeof(string), - FieldAttributes.Private); - FieldBuilder deleF = typeB.DefineField("delegate_created", - typeof(Service.SignalCalledHandler), - FieldAttributes.Private); - BuildFinalizer (typeB, serviceF, deleF); - - MethodInfo signalCalledMI = BuildSignalCalled(ref typeB, serviceF, pathF); - BuildConstructor(ref typeB, serviceF, pathF, signalCalledMI, deleF); - - // Build the methods - 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); - } - } - - proxyType = typeB.CreateType(); - - // Uncomment the following line to produce a DLL of the - // constructed assembly which can then be examined using - // 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. - //Service.ProxyAssembly.Save(Service.Name + ".proxy.dll"); - } - - Type [] parTypes = new Type[] {typeof(Service), typeof(string)}; - object [] pars = new object[] {Service, pathName}; - - ConstructorInfo constructor = proxyType.GetConstructor(parTypes); - object instance = constructor.Invoke(pars); - return instance; - } - - private Service Service - { - get { - return this.service; - } - } - - private string ObjectName - { - get { - return this.introspector.ToString(); - } - } - } -} - |