[prev in list] [next in list] [prev in thread] [next in thread] 

List:       avalon-cvs
Subject:    svn commit: rev 47443 - in avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src: . DynamicPro
From:       hammett () apache ! org
Date:       2004-09-29 2:27:47
Message-ID: 20040929022747.84896.qmail () minotaur ! apache ! org
[Download RAW message or body]

Author: hammett
Date: Tue Sep 28 19:27:47 2004
New Revision: 47443

Added:
   avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/
   avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/
   avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Apache.Avalon.DynamicProxy.csproj \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/AssemblyInfo.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/
  avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ModuleScope.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/OpCodesDictionary.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/DefaultProxyBuilder.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/GeneratorContext.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/IProxyBuilder.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/DynamicProxy.sln \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/IInvocationHandler.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/ProxyGenerator.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/StandardInvocationHandler.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Apache.Avalon.DynamicProxy.Test.csproj \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/AssemblyInfo.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CachedTypeTestCase.cs
  avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/
  avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMyInterface.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMySecondInterface.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IServiceStatus.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MyInterfaceImpl.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MySecondInterfaceImpl.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/ServiceStatusImpl.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/ \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/MySerializableClass.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/NoVirtualMethodClass.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SealedMethodsClass.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/ServiceClass.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SpecializedServiceClass.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CustomProxyGeneratorTestCase.cs \
(contents, props changed)  \
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ProxyGeneratorTestCase.cs
  avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/SerializableClassTestCase.cs \
(contents, props changed) Log:
Reorganizing directories.

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Apache.Avalon.DynamicProxy.csproj
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Apache.Avalon.DynamicProxy.csproj	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,150 @@
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "Apache.Avalon.DynamicProxy"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "Apache.Avalon.DynamicProxy"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "..\bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "..\..\bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll" +                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll" +                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll" +                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "IInvocationHandler.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ProxyGenerator.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "StandardInvocationHandler.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\DefaultProxyBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\GeneratorContext.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\IProxyBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\CodeGenerators\BaseCodeGenerator.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\CodeGenerators\ClassProxyGenerator.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\CodeGenerators\InterfaceProxyGenerator.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\CodeGenerators\ModuleScope.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Builder\CodeGenerators\OpCodesDictionary.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/AssemblyInfo.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/AssemblyInfo.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,32 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyTitle("Avalon DynamicProxy")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("The Apache Software Foundation")]
+[assembly: AssemblyProduct("Avalon DynamicProxy")]
+[assembly: AssemblyCopyright("Copyright (c) 2004 The Apache Software Foundation")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+[assembly: AssemblyVersion("1.0.0.1")]
+
+#if STRONG
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../../../ApacheAvalon.snk")]
+[assembly: AssemblyKeyName("")]
+#endif

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,472 @@
+using System.Text;
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
+{
+	using System;
+	using System.Collections;
+	using System.Reflection;
+	using System.Reflection.Emit;
+
+	/// <summary>
+	/// Summary description for BaseCodeGenerator.
+	/// </summary>
+	public abstract class BaseCodeGenerator
+	{
+
+		private Type m_baseType = typeof (Object);
+		private TypeBuilder m_typeBuilder;
+		private FieldBuilder m_handlerField;
+		private ConstructorBuilder m_constBuilder;
+		private IList m_generated = new ArrayList();
+
+		private GeneratorContext m_context;
+		private ModuleScope m_moduleScope;
+
+		protected BaseCodeGenerator(ModuleScope moduleScope) : this(moduleScope, new \
GeneratorContext()) +		{
+		}
+
+		protected BaseCodeGenerator(ModuleScope moduleScope, GeneratorContext context)
+		{
+			m_moduleScope = moduleScope;
+			m_context = context;
+		}
+
+		protected ModuleScope ModuleScope
+		{
+			get { return m_moduleScope; }
+		}
+
+		protected GeneratorContext Context
+		{
+			get { return m_context; }
+		}
+
+		protected TypeBuilder MainTypeBuilder
+		{
+			get { return m_typeBuilder; }
+		}
+
+		protected FieldBuilder HandlerFieldBuilder
+		{
+			get { return m_handlerField; }
+		}
+
+		protected ConstructorBuilder DefaultConstructorBuilder
+		{
+			get { return m_constBuilder; }
+		}
+
+		protected Type GetFromCache( Type baseClass, Type[] interfaces )
+		{
+			return ModuleScope[ GenerateTypeName( baseClass, interfaces ) ] as Type;
+		}
+
+		protected void RegisterInCache( Type generatedType )
+		{
+			ModuleScope[ generatedType.Name ] = generatedType;
+		}
+
+		protected virtual TypeBuilder CreateTypeBuilder(Type baseType, Type[] interfaces)
+		{
+			String typeName = GenerateTypeName(baseType, interfaces);
+
+			ModuleBuilder moduleBuilder = ModuleScope.ObtainDynamicModule();
+
+			TypeAttributes flags = TypeAttributes.Public | TypeAttributes.Class; 
+
+			if (baseType != typeof(Object))
+			{
+				if (baseType.IsSerializable)
+				{
+					flags |= TypeAttributes.Serializable;
+				}
+			}
+
+			m_baseType = baseType;
+			m_typeBuilder = moduleBuilder.DefineType(
+				typeName, flags, baseType, interfaces);
+
+			m_handlerField = GenerateField();
+			m_constBuilder = GenerateConstructor();
+
+			return m_typeBuilder;
+		}
+
+		protected virtual String GenerateTypeName(Type type, Type[] interfaces)
+		{
+			StringBuilder sb = new StringBuilder();
+			foreach(Type inter in interfaces)
+			{
+				sb.Append('_');
+				sb.Append(inter.Name);
+			}
+			/// Naive implementation
+			return String.Format("ProxyType{0}{1}", type.Name, sb.ToString());
+		}
+
+		protected virtual void EnhanceType()
+		{
+			if (Context.EnhanceType != null)
+			{
+				Context.EnhanceType(MainTypeBuilder, HandlerFieldBuilder, \
DefaultConstructorBuilder); +			}
+		}
+
+		protected virtual Type[] ScreenInterfaces(Type[] interfaces)
+		{
+			if (Context.ScreenInterfaces != null)
+			{
+				interfaces = Context.ScreenInterfaces(interfaces);
+			}
+
+			return interfaces;
+		}
+
+		protected virtual Type CreateType()
+		{
+			Type newType = MainTypeBuilder.CreateType();
+
+			RegisterInCache( newType );
+
+			return newType;
+		}
+
+		/// <summary>
+		/// Generates a public field holding the <see cref="IInvocationHandler"/>
+		/// </summary>
+		/// <returns><see cref="FieldBuilder"/> instance</returns>
+		protected FieldBuilder GenerateField()
+		{
+			return GenerateField("handler", typeof (IInvocationHandler));
+		}
+
+		/// <summary>
+		/// Generates a public field
+		/// </summary>
+		/// <param name="name">Field's name</param>
+		/// <param name="type">Field's type</param>
+		/// <returns></returns>
+		protected FieldBuilder GenerateField(String name, Type type)
+		{
+			return m_typeBuilder.DefineField(name,
+			                                 typeof (IInvocationHandler), \
FieldAttributes.Public); +		}
+
+		/// <summary>
+		/// Generates one public constructor receiving 
+		/// the <see cref="IInvocationHandler"/> instance.
+		/// </summary>
+		/// <returns><see cref="ConstructorBuilder"/> instance</returns>
+		protected ConstructorBuilder GenerateConstructor()
+		{
+			ConstructorBuilder consBuilder = m_typeBuilder.DefineConstructor(
+				MethodAttributes.Public,
+				CallingConventions.Standard,
+				new Type[] {typeof (IInvocationHandler)});
+
+			ILGenerator ilGenerator = consBuilder.GetILGenerator();
+			ilGenerator.Emit(OpCodes.Ldarg_0);
+			ilGenerator.Emit(OpCodes.Call, m_baseType.GetConstructor(new Type[0]));
+			ilGenerator.Emit(OpCodes.Ldarg_0);
+			ilGenerator.Emit(OpCodes.Ldarg_1);
+			ilGenerator.Emit(OpCodes.Stfld, m_handlerField);
+			ilGenerator.Emit(OpCodes.Ret);
+
+			return consBuilder;
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="interfaces"></param>
+		protected void GenerateInterfaceImplementation(Type[] interfaces)
+		{
+			foreach(Type inter in interfaces)
+			{
+				if (!Context.ShouldSkip(inter))
+				{
+					GenerateTypeImplementation(inter, false);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Iterates over the interfaces and generate implementation 
+		/// for each method in it.
+		/// </summary>
+		/// <param name="type">Type class</param>
+		/// <param name="ignoreInterfaces">Interface type</param>
+		protected void GenerateTypeImplementation(Type type, bool ignoreInterfaces)
+		{
+			if (m_generated.Contains(type))
+			{
+				return;
+			}
+			else
+			{
+				m_generated.Add(type);
+			}
+
+			if (!ignoreInterfaces)
+			{
+				Type[] baseInterfaces = type.FindInterfaces(new TypeFilter(NoFilterImpl), type);
+
+				GenerateInterfaceImplementation(baseInterfaces);
+			}
+
+			PropertyBuilder[] propertiesBuilder = GenerateProperties(type);
+			GenerateMethods(type, propertiesBuilder);
+		}
+
+		protected virtual PropertyBuilder[] GenerateProperties(Type inter)
+		{
+			PropertyInfo[] properties = inter.GetProperties();
+			PropertyBuilder[] propertiesBuilder = new PropertyBuilder[properties.Length];
+
+			for(int i = 0; i < properties.Length; i++)
+			{
+				propertiesBuilder[i] = GeneratePropertyImplementation(properties[i]);
+			}
+
+			return propertiesBuilder;
+		}
+
+		protected virtual void GenerateMethods(Type inter, PropertyBuilder[] \
propertiesBuilder) +		{
+			MethodInfo[] methods = inter.GetMethods();
+
+			foreach(MethodInfo method in methods)
+			{
+				GenerateMethodImplementation(method, propertiesBuilder);
+			}
+		}
+
+		/// <summary>
+		/// Generate property implementation
+		/// </summary>
+		/// <param name="property"></param>
+		protected PropertyBuilder GeneratePropertyImplementation(PropertyInfo property)
+		{
+			return m_typeBuilder.DefineProperty(
+				property.Name, property.Attributes, property.PropertyType, null);
+		}
+
+		/// <summary>
+		/// Generates implementation for each method.
+		/// </summary>
+		/// <param name="method"></param>
+		/// <param name="properties"></param>
+		protected void GenerateMethodImplementation(
+			MethodInfo method, PropertyBuilder[] properties)
+		{
+			if (method.IsFinal)
+			{
+				return;
+			}
+
+			ParameterInfo[] parameterInfo = method.GetParameters();
+
+			Type[] parameters = new Type[parameterInfo.Length];
+
+			for(int i = 0; i < parameterInfo.Length; i++)
+			{
+				parameters[i] = parameterInfo[i].ParameterType;
+			}
+
+			MethodAttributes atts = MethodAttributes.Public | MethodAttributes.Virtual;
+
+			if (method.Name.StartsWith("set_") || method.Name.StartsWith("get_"))
+			{
+				atts = MethodAttributes.Public | MethodAttributes.SpecialName | \
MethodAttributes.Virtual; +			}
+
+			MethodBuilder methodBuilder =
+				m_typeBuilder.DefineMethod(method.Name, atts, CallingConventions.Standard,
+				                           method.ReturnType, parameters);
+
+			if (method.Name.StartsWith("set_") || method.Name.StartsWith("get_"))
+			{
+				foreach(PropertyBuilder property in properties)
+				{
+					if (property == null)
+					{
+						break;
+					}
+
+					if (!property.Name.Equals(method.Name.Substring(4)))
+					{
+						continue;
+					}
+
+					if (methodBuilder.Name.StartsWith("set_"))
+					{
+						property.SetSetMethod(methodBuilder);
+						break;
+					}
+					else
+					{
+						property.SetGetMethod(methodBuilder);
+						break;
+					}
+				}
+			}
+
+			WriteILForMethod(method, methodBuilder, parameters, HandlerFieldBuilder);
+		}
+
+		/// <summary>
+		/// Writes the stack for the method implementation. This 
+		/// method generates the IL stack for property get/set method and
+		/// ordinary methods.
+		/// </summary>
+		/// <remarks>
+		/// The method implementation would be as simple as:
+		/// <code>
+		/// public void SomeMethod( int parameter )
+		/// {
+		///     MethodBase method = MethodBase.GetCurrentMethod();
+		///     handler.Invoke( this, method, new object[] { parameter } );
+		/// }
+		/// </code>
+		/// </remarks>
+		/// <param name="builder"><see cref="MethodBuilder"/> being constructed.</param>
+		/// <param name="parameters"></param>
+		/// <param name="handlerField"></param>
+		protected void WriteILForMethod(MethodInfo method, MethodBuilder builder,
+		                                Type[] parameters, FieldBuilder handlerField)
+		{
+			int arrayPositionInStack = 1;
+
+			ILGenerator ilGenerator = builder.GetILGenerator();
+
+			ilGenerator.DeclareLocal(typeof (MethodBase));
+
+			if (builder.ReturnType != typeof (void))
+			{
+				ilGenerator.DeclareLocal(builder.ReturnType);
+				arrayPositionInStack = 2;
+			}
+
+			ilGenerator.DeclareLocal(typeof (object[]));
+
+			ilGenerator.Emit(OpCodes.Ldtoken, method);
+			ilGenerator.Emit(OpCodes.Call, typeof \
(MethodBase).GetMethod("GetMethodFromHandle")); +
+			ilGenerator.Emit(OpCodes.Stloc_0);
+			ilGenerator.Emit(OpCodes.Ldarg_0);
+			ilGenerator.Emit(OpCodes.Ldfld, handlerField);
+			ilGenerator.Emit(OpCodes.Ldarg_0);
+			ilGenerator.Emit(OpCodes.Ldloc_0);
+			ilGenerator.Emit(OpCodes.Ldc_I4, parameters.Length);
+			ilGenerator.Emit(OpCodes.Newarr, typeof (object));
+
+			if (parameters.Length != 0)
+			{
+				ilGenerator.Emit(OpCodes.Stloc, arrayPositionInStack);
+				ilGenerator.Emit(OpCodes.Ldloc, arrayPositionInStack);
+			}
+
+			for(int c = 0; c < parameters.Length; c++)
+			{
+				ilGenerator.Emit(OpCodes.Ldc_I4, c);
+				ilGenerator.Emit(OpCodes.Ldarg, c + 1);
+
+				if (parameters[c].IsValueType)
+				{
+					ilGenerator.Emit(OpCodes.Box, parameters[c].UnderlyingSystemType);
+				}
+
+				ilGenerator.Emit(OpCodes.Stelem_Ref);
+				ilGenerator.Emit(OpCodes.Ldloc, arrayPositionInStack);
+			}
+
+			ilGenerator.Emit(OpCodes.Callvirt, typeof \
(IInvocationHandler).GetMethod("Invoke")); +
+			if (builder.ReturnType != typeof (void))
+			{
+				if (!builder.ReturnType.IsValueType)
+				{
+					ilGenerator.Emit(OpCodes.Castclass, builder.ReturnType);
+				}
+				else
+				{
+					ilGenerator.Emit(OpCodes.Unbox, builder.ReturnType);
+					ilGenerator.Emit(ConvertTypeToOpCode(builder.ReturnType));
+				}
+
+				ilGenerator.Emit(OpCodes.Stloc, 1);
+
+				Label label = ilGenerator.DefineLabel();
+				ilGenerator.Emit(OpCodes.Br_S, label);
+				ilGenerator.MarkLabel(label);
+				ilGenerator.Emit(OpCodes.Ldloc, 1);
+			}
+			else
+			{
+				ilGenerator.Emit(OpCodes.Pop);
+			}
+
+			ilGenerator.Emit(OpCodes.Ret);
+		}
+
+		/// <summary>
+		/// Converts a Value type to a correspondent OpCode of 
+		/// </summary>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		protected virtual OpCode ConvertTypeToOpCode(Type type)
+		{
+			if (type.IsEnum)
+			{
+				Enum baseType = (Enum) Activator.CreateInstance(type);
+				TypeCode code = baseType.GetTypeCode();
+
+				switch(code)
+				{
+					case TypeCode.Byte:
+						type = typeof (Byte);
+						break;
+					case TypeCode.Int16:
+						type = typeof (Int16);
+						break;
+					case TypeCode.Int32:
+						type = typeof (Int32);
+						break;
+					case TypeCode.Int64:
+						type = typeof (Int64);
+						break;
+				}
+
+				return ConvertTypeToOpCode(type);
+			}
+
+			OpCode opCode = OpCodesDictionary.Instance[ type ];
+
+			if (Object.ReferenceEquals(opCode, OpCodesDictionary.EmptyOpCode))
+			{
+				throw new ArgumentException("Type " + type + " could not be converted to a \
OpCode"); +			}
+
+			return opCode;
+		}
+
+		public static bool NoFilterImpl(Type type, object criteria)
+		{
+			return true;
+		}
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for ClassProxyGenerator.
+	/// </summary>
+	public class ClassProxyGenerator : BaseCodeGenerator
+	{
+		public ClassProxyGenerator(ModuleScope scope) : base(scope)
+		{
+		}
+
+		public ClassProxyGenerator(ModuleScope scope, GeneratorContext context) : \
base(scope, context) +		{
+		}
+
+		public Type GenerateCode(Type baseClass)
+		{
+			Type[] interfaces = new Type[0];
+			interfaces = ScreenInterfaces(interfaces);
+
+			Type cacheType = GetFromCache(baseClass, interfaces);
+			
+			if (cacheType != null)
+			{
+				return cacheType;
+			}
+
+			CreateTypeBuilder( baseClass, interfaces );
+			GenerateTypeImplementation( baseClass, true );
+
+			EnhanceType();
+
+			return CreateType();
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,52 @@
+ // Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for InterfaceProxyGenerator.
+	/// </summary>
+	public class InterfaceProxyGenerator : BaseCodeGenerator
+	{
+		public InterfaceProxyGenerator(ModuleScope scope) : base(scope)
+		{
+		}
+
+		public InterfaceProxyGenerator(ModuleScope scope, GeneratorContext context) : \
base(scope, context) +		{
+		}
+
+		public virtual Type GenerateCode(Type[] interfaces)
+		{
+			interfaces = ScreenInterfaces(interfaces);
+
+			Type cacheType = GetFromCache(typeof(Object), interfaces);
+			
+			if (cacheType != null)
+			{
+				return cacheType;
+			}
+
+			CreateTypeBuilder( typeof(Object), interfaces );
+			GenerateInterfaceImplementation( interfaces );
+
+			EnhanceType();
+
+			return CreateType();
+		}
+
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ModuleScope.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/ModuleScope.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,80 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
+{
+	using System;
+	using System.Reflection;
+	using System.Reflection.Emit;
+	using System.Collections;
+
+	/// <summary>
+	/// Summary description for ModuleScope.
+	/// </summary>
+	public class ModuleScope
+	{
+		private static readonly String FILE_NAME = "GeneratedAssembly.dll";
+
+		/// <summary>
+		/// Avoid leaks caused by non disposal of generated types.
+		/// </summary>
+		private ModuleBuilder m_moduleBuilder = null;
+
+		/// <summary>
+		/// Keep track of generated types
+		/// </summary>
+		private Hashtable m_typeCache = Hashtable.Synchronized(new Hashtable());
+
+		/// <summary>
+		/// Used to lock the module builder creation
+		/// </summary>
+		private object m_lockobj = new object();
+
+		private AssemblyBuilder m_assemblyBuilder;
+
+		public ModuleBuilder ObtainDynamicModule()
+		{
+			lock (m_lockobj)
+			{
+				if (m_moduleBuilder == null)
+				{
+					AssemblyName assemblyName = new AssemblyName();
+					assemblyName.Name = "DynamicAssemblyProxyGen";
+
+#if ( DEBUG )
+					m_assemblyBuilder =
+						AppDomain.CurrentDomain.DefineDynamicAssembly(
+						assemblyName,
+						AssemblyBuilderAccess.RunAndSave);
+					m_moduleBuilder = m_assemblyBuilder.DefineDynamicModule(assemblyName.Name, \
FILE_NAME); +#else
+					m_assemblyBuilder =
+						AppDomain.CurrentDomain.DefineDynamicAssembly(
+							assemblyName,
+							AssemblyBuilderAccess.Run);
+					m_moduleBuilder = m_assemblyBuilder.DefineDynamicModule(assemblyName.Name, \
true); +#endif
+				}
+			}
+
+			return m_moduleBuilder;
+		}
+
+		public Type this[String name]
+		{
+			get { return m_typeCache[name] as Type; }
+			set { m_typeCache[name] = value; }
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/OpCodesDictionary.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/CodeGenerators/OpCodesDictionary.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,64 @@
+using System.Reflection.Emit;
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
+{
+	using System;
+	using System.Collections;
+
+	/// <summary>
+	/// Summary description for OpCodesDictionary.
+	/// </summary>
+	public sealed class OpCodesDictionary : DictionaryBase
+	{
+		private static readonly OpCodesDictionary m_dict = new OpCodesDictionary();
+
+		private static readonly OpCode m_emptyOpCode = new OpCode();
+
+		private OpCodesDictionary() : base()
+		{
+			Dictionary[ typeof (Int16) ] = OpCodes.Ldind_I2;
+			Dictionary[ typeof (Int32) ] = OpCodes.Ldind_I4;
+			Dictionary[ typeof (Int64) ] = OpCodes.Ldind_I8;
+			Dictionary[ typeof (float) ] = OpCodes.Ldind_R4;
+			Dictionary[ typeof (double) ] = OpCodes.Ldind_R8;
+			Dictionary[ typeof (UInt16) ] = OpCodes.Ldind_U2;
+			Dictionary[ typeof (UInt32) ] = OpCodes.Ldind_U4;
+			Dictionary[ typeof (bool) ] = OpCodes.Ldind_I4;
+		}
+
+		public OpCode this[Type type]
+		{
+			get
+			{
+				if (Dictionary.Contains(type))
+				{
+					return (OpCode) Dictionary[ type ];
+				}
+				return EmptyOpCode;
+			}
+		}
+
+		public static OpCodesDictionary Instance
+		{
+			get { return m_dict; }
+		}
+
+		public static OpCode EmptyOpCode
+		{
+			get { return m_emptyOpCode; }
+		}
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/DefaultProxyBuilder.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/DefaultProxyBuilder.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,60 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder
+{
+	using System;
+	using Apache.Avalon.DynamicProxy.Builder.CodeGenerators;
+
+	/// <summary>
+	/// Summary description for DefaultProxyBuilder.
+	/// </summary>
+	public class DefaultProxyBuilder : IProxyBuilder
+	{
+		ModuleScope m_scope = new ModuleScope();
+
+		public DefaultProxyBuilder()
+		{
+			
+		}
+
+		#region IProxyBuilder Members
+
+		public virtual Type CreateInterfaceProxy(Type[] interfaces)
+		{
+			InterfaceProxyGenerator generator = new InterfaceProxyGenerator(m_scope);
+			return generator.GenerateCode( interfaces );
+		}
+
+		public virtual Type CreateClassProxy(Type theClass)
+		{
+			ClassProxyGenerator generator = new ClassProxyGenerator(m_scope);
+			return generator.GenerateCode( theClass );
+		}
+
+		public virtual Type CreateCustomInterfaceProxy(Type[] interfaces, GeneratorContext \
context) +		{
+			InterfaceProxyGenerator generator = new InterfaceProxyGenerator(m_scope, \
context); +			return generator.GenerateCode( interfaces );
+		}
+
+		public virtual Type CreateCustomClassProxy(Type theClass, GeneratorContext \
context) +		{
+			ClassProxyGenerator generator = new ClassProxyGenerator(m_scope, context);
+			return generator.GenerateCode( theClass );
+		}
+
+		#endregion
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/GeneratorContext.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/GeneratorContext.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,68 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy
+{
+	using System;
+	using System.Collections;
+
+	/// <summary>
+	/// Summary description for GeneratorContext.
+	/// </summary>
+	public sealed class GeneratorContext : DictionaryBase
+	{
+		private EnhanceTypeDelegate m_enhance;
+		private ScreenInterfacesDelegate m_screenInterfaces;
+		private IList m_skipInterfaces = new ArrayList();
+
+		public GeneratorContext()
+		{
+		}
+
+		public GeneratorContext(EnhanceTypeDelegate enhanceDelegate, 
+			ScreenInterfacesDelegate screenDelegate)
+		{
+			m_enhance = enhanceDelegate;
+			m_screenInterfaces = screenDelegate;
+		}
+
+		public EnhanceTypeDelegate EnhanceType
+		{
+			get { return m_enhance; }
+			set { m_enhance = value; }
+		}
+
+		public ScreenInterfacesDelegate ScreenInterfaces
+		{
+			get { return m_screenInterfaces; }
+			set { m_screenInterfaces = value; }
+		}
+
+		public bool ShouldSkip( Type interfaceType )
+		{
+			return m_skipInterfaces.Contains( interfaceType );
+		}
+
+		public void AddInterfaceToSkip( Type interfaceType )
+		{
+			m_skipInterfaces.Add( interfaceType );
+		}
+
+		public object this[ String key ]
+		{
+			get { return Dictionary[key]; }
+			set { Dictionary[key] = value; }
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/IProxyBuilder.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/Builder/IProxyBuilder.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,32 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Builder
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for IProxyBuilder.
+	/// </summary>
+	public interface IProxyBuilder
+	{
+		Type CreateInterfaceProxy( Type[] interfaces );
+
+		Type CreateCustomInterfaceProxy( Type[] interfaces, GeneratorContext context );
+
+		Type CreateClassProxy( Type theClass );
+
+		Type CreateCustomClassProxy( Type theClass, GeneratorContext context );
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/DynamicProxy.sln
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/DynamicProxy.sln	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,29 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Avalon.DynamicProxy", \
"Apache.Avalon.DynamicProxy.csproj", "{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}" \
+	ProjectSection(ProjectDependencies) = postProject +	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = \
"Apache.Avalon.DynamicProxy.Test", \
"DynamicProxyTest\Apache.Avalon.DynamicProxy.Test.csproj", \
"{EF89321E-FB2A-41B6-85B3-794D50A55CF1}" +	ProjectSection(ProjectDependencies) = \
postProject +	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}.Debug.ActiveCfg = Debug|.NET
+		{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}.Debug.Build.0 = Debug|.NET
+		{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}.Release.ActiveCfg = Release|.NET
+		{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}.Release.Build.0 = Release|.NET
+		{EF89321E-FB2A-41B6-85B3-794D50A55CF1}.Debug.ActiveCfg = Debug|.NET
+		{EF89321E-FB2A-41B6-85B3-794D50A55CF1}.Debug.Build.0 = Debug|.NET
+		{EF89321E-FB2A-41B6-85B3-794D50A55CF1}.Release.ActiveCfg = Release|.NET
+		{EF89321E-FB2A-41B6-85B3-794D50A55CF1}.Release.Build.0 = Release|.NET
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/IInvocationHandler.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/IInvocationHandler.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,35 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy
+{
+	using System;
+	using System.Reflection;
+
+	/// <summary>
+	/// Defines the handler that will receive all methods 
+	/// invoked on the proxy object.
+	/// </summary>
+	public interface IInvocationHandler
+	{
+		/// <summary>
+		/// Implementation should invoke the method on the real object.
+		/// </summary>
+		/// <param name="proxy">proxy instance</param>
+		/// <param name="method"><see cref="System.Reflection.MethodInfo"/> being \
invoked.</param> +		/// <param name="arguments">Arguments of method - if any</param>
+		/// <returns>Should return the result of method invocation</returns>
+		object Invoke(object proxy, MethodInfo method, params object[] arguments);
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/ProxyGenerator.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/ProxyGenerator.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,201 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy
+{
+	using System;
+	using System.Reflection.Emit;
+
+	using Apache.Avalon.DynamicProxy.Builder;
+
+	public delegate void EnhanceTypeDelegate( TypeBuilder mainType, FieldBuilder \
handlerFieldBuilder, ConstructorBuilder constructorBuilder ); +
+	public delegate Type[] ScreenInterfacesDelegate( Type[] interfaces );
+
+	/// <summary>
+	/// Generates a Java style proxy. This overrides the .Net proxy requirements 
+	/// that forces one to extend MarshalByRefObject or (for a different purpose)
+	/// ContextBoundObject to have a Proxiable class.
+	/// </summary>
+	/// <remarks>
+	/// The <see cref="ProxyGenerator"/> should be used to generate a class 
+	/// implementing the specified interfaces. The class implementation will 
+	/// only call the internal <see cref="IInvocationHandler"/> instance.
+	/// </remarks>
+	/// <remarks>
+	/// This proxy implementation currently doesn't not supports ref and out arguments 
+	/// in methods.
+	/// </remarks>
+	/// <example>
+	/// <code>
+	/// MyInvocationHandler handler = ...
+	/// ProxyGenerator generator = new ProxyGenerator();
+	/// IInterfaceExposed proxy = 
+	///		generator.CreateProxy( new Type[] { typeof(IInterfaceExposed) }, handler );
+	/// </code>
+	/// </example>
+	public class ProxyGenerator
+	{
+		private IProxyBuilder m_builder;
+
+		public ProxyGenerator(IProxyBuilder builder)
+		{
+			m_builder = builder;
+		}
+
+		public ProxyGenerator() : this( new DefaultProxyBuilder() )
+		{
+		}
+
+		public IProxyBuilder ProxyBuilder
+		{
+			get { return m_builder; }
+			set { m_builder = value; }
+		}
+
+		public virtual object CreateClassProxy(Type baseClass, IInvocationHandler handler)
+		{
+			AssertCreateClassProxyArguments(baseClass, handler);
+
+			Type newType = ProxyBuilder.CreateClassProxy(baseClass);
+			return CreateProxyInstance( newType, handler );
+		}
+
+		public virtual object CreateCustomClassProxy(Type baseClass, 
+			IInvocationHandler handler, GeneratorContext context)
+		{
+			AssertCreateClassProxyArguments(baseClass, handler, context);
+
+			Type newType = ProxyBuilder.CreateCustomClassProxy(baseClass, context);
+			return CreateProxyInstance( newType, handler, context );
+		}
+
+		/// <summary>
+		/// Generates a proxy implementing all the specified interfaces and
+		/// redirecting method invocations to the specifed handler.
+		/// </summary>
+		/// <param name="theInterface">Interface to be implemented</param>
+		/// <param name="handler">instance of <see cref="IInvocationHandler"/></param>
+		/// <returns>Proxy instance</returns>
+		public virtual object CreateProxy(Type theInterface, IInvocationHandler handler)
+		{
+			return CreateProxy(new Type[] {theInterface}, handler);
+		}
+
+		/// <summary>
+		/// Generates a proxy implementing all the specified interfaces and
+		/// redirecting method invocations to the specifed handler.
+		/// </summary>
+		/// <param name="interfaces">Array of interfaces to be implemented</param>
+		/// <param name="handler">instance of <see cref="IInvocationHandler"/></param>
+		/// <returns>Proxy instance</returns>
+		public virtual object CreateProxy(Type[] interfaces, IInvocationHandler handler)
+		{
+			AssertCreateProxyArguments(interfaces, handler);
+
+			Type newType = ProxyBuilder.CreateInterfaceProxy(interfaces);
+			return CreateProxyInstance( newType, handler );
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="theInterface"></param>
+		/// <param name="handler"></param>
+		/// <param name="context"></param>
+		/// <returns></returns>
+		public virtual object CreateCustomProxy(Type theInterface, 
+			IInvocationHandler handler, 
+			GeneratorContext context )
+		{
+			return CreateCustomProxy( new Type[] { theInterface }, handler, context );
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="interfaces"></param>
+		/// <param name="handler"></param>
+		/// <param name="context"></param>
+		/// <returns></returns>
+		public virtual object CreateCustomProxy(Type[] interfaces, 
+			IInvocationHandler handler, GeneratorContext context )
+		{
+			AssertCreateProxyArguments( interfaces, handler, context );
+			Type newType = ProxyBuilder.CreateCustomInterfaceProxy(interfaces, context);
+			return CreateProxyInstance( newType, handler, context );
+		}
+
+		protected virtual object CreateProxyInstance(Type type, IInvocationHandler \
handler) +		{
+			return Activator.CreateInstance(type, new object[] {handler});
+		}
+
+		protected virtual object CreateProxyInstance(Type type, IInvocationHandler \
handler, GeneratorContext context) +		{
+			return CreateProxyInstance( type, handler );
+		}
+
+		protected static void AssertCreateProxyArguments(Type[] interfaces, \
IInvocationHandler handler) +		{
+			if (interfaces == null)
+			{
+				throw new ArgumentNullException("interfaces");
+			}
+			if (handler == null)
+			{
+				throw new ArgumentNullException("handler");
+			}
+			if (interfaces.Length == 0)
+			{
+				throw new ArgumentException("Can't handle an empty interface array");
+			}
+		}
+
+		protected static void AssertCreateProxyArguments(Type[] interfaces, \
IInvocationHandler handler, GeneratorContext context) +		{
+			AssertCreateProxyArguments(interfaces, handler);
+
+			if (context == null)
+			{
+				throw new ArgumentNullException("context");
+			}
+		}
+
+		protected static void AssertCreateClassProxyArguments(Type baseClass, \
IInvocationHandler handler) +		{
+			if (baseClass == null)
+			{
+				throw new ArgumentNullException("theClass");
+			}
+			if (baseClass.IsInterface)
+			{
+				throw new ArgumentException("'baseClass' must be a class, not an interface");
+			}
+			if (handler == null)
+			{
+				throw new ArgumentNullException("handler");
+			}
+		}
+
+		protected static void AssertCreateClassProxyArguments(Type baseClass, \
IInvocationHandler handler, GeneratorContext context) +		{
+			AssertCreateClassProxyArguments(baseClass, handler);
+			if (context == null)
+			{
+				throw new ArgumentNullException("context");
+			}
+		}
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/StandardInvocationHandler.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxy/StandardInvocationHandler.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,68 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy
+{
+	using System;
+
+	/// <summary>
+	/// Provides a standard implementation of <see cref="IInvocationHandler"/>.
+	/// Methods PreInvoke, PostInvoke can be overrided to customize its behavior.
+	/// </summary>
+	public class StandardInvocationHandler : IInvocationHandler
+	{
+		private object m_target;
+
+		public StandardInvocationHandler(object target)
+		{
+			if (target == null)
+			{
+				throw new ArgumentNullException("target");
+			}
+
+			m_target = target;
+		}
+
+		protected virtual void PreInvoke(object proxy, System.Reflection.MethodInfo \
method, params object[] arguments) +		{
+		}
+
+		protected virtual void PostInvoke(object proxy, System.Reflection.MethodInfo \
method, ref object returnValue, params object[] arguments) +		{
+		}
+
+		#region IInvocationHandler Members
+
+		public virtual object Invoke(object proxy, System.Reflection.MethodInfo method, \
params object[] arguments) +		{
+			PreInvoke(proxy, method, arguments);
+
+			object returnValue = method.Invoke( Target, arguments );
+
+			PostInvoke(proxy, method, ref returnValue, arguments);
+			
+			return returnValue;
+		}
+
+		#endregion
+
+		public object Target
+		{
+			get
+			{
+				return m_target;
+			}
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Apache.Avalon.DynamicProxy.Test.csproj
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Apache.Avalon.DynamicProxy.Test.csproj	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,181 @@
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{EF89321E-FB2A-41B6-85B3-794D50A55CF1}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "Apache.Avalon.DynamicProxy.Test"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "Apache.Avalon.DynamicProxy.Test"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "..\..\bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "..\..\bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll" +                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll" +                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = \
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll" +                />
+                <Reference
+                    Name = "DProxy"
+                    Project = "{70EE6AF2-1F6D-4CC5-A1B2-C3182F035F67}"
+                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = \
"..\..\..\..\..\..\dotnet\NUnit22\bin\nunit.framework.dll" +                    \
AssemblyFolderKey = "hklm\dn\nunit.framework" +                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "CachedTypeTestCase.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "CustomProxyGeneratorTestCase.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ProxyGeneratorTestCase.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SerializableClassTestCase.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Classes\MySerializableClass.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Classes\NoVirtualMethodClass.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Classes\SealedMethodsClass.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Classes\ServiceClass.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Classes\SpecializedServiceClass.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\IMyInterface.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\IMySecondInterface.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\IServiceStatus.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\MyInterfaceImpl.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\MySecondInterfaceImpl.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ClassInterfaces\ServiceStatusImpl.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/AssemblyInfo.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/AssemblyInfo.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,27 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyTitle("Avalon DynamicProxy Test cases")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("The Apache Software Foundation")]
+[assembly: AssemblyProduct("Avalon DynamicProxy Test cases")]
+[assembly: AssemblyCopyright("Copyright (c) 2004 The Apache Software Foundation")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+[assembly: AssemblyVersion("1.0.0.1")]
+

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CachedTypeTestCase.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CachedTypeTestCase.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,47 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test
+{
+	using System;
+
+	using NUnit.Framework;
+
+	using Apache.Avalon.DynamicProxy.Test.Classes;
+
+	/// <summary>
+	/// Summary description for CachedTypeTestCase.
+	/// </summary>
+	[TestFixture]
+	public class CachedTypeTestCase
+	{
+		private ProxyGenerator m_generator = new ProxyGenerator();
+
+		[Test]
+		public void CachedClassProxies()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(ServiceClass), new StandardInvocationHandler( new ServiceClass() ) );
+			
+			Assert.IsNotNull(proxy);
+			Assert.IsTrue( typeof(ServiceClass).IsAssignableFrom( proxy.GetType() ) );
+
+			proxy = m_generator.CreateClassProxy( 
+				typeof(ServiceClass), new StandardInvocationHandler( new ServiceClass() ) );
+			
+			Assert.IsNotNull(proxy);
+			Assert.IsTrue( typeof(ServiceClass).IsAssignableFrom( proxy.GetType() ) );
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMyInterface.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMyInterface.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,40 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for IMyInterface.
+	/// </summary>
+	public interface IMyInterface
+	{
+		String Name
+		{
+			get;
+			set;
+		}
+
+		bool Started
+		{
+			get;
+			set;
+		}
+
+		int Calc(int x, int y);
+
+		int Calc(int x, int y, int z, Single k);
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMySecondInterface.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IMySecondInterface.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,30 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for IMySecondInterface.
+	/// </summary>
+	public interface IMySecondInterface : IMyInterface
+	{
+		String Address
+		{
+			get;
+			set;
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IServiceStatus.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/IServiceStatus.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,45 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Simple enum declaration
+	/// </summary>
+	public enum State
+	{
+		Valid, 
+		Invalid
+	}
+
+	/// <summary>
+	/// Summary description for IServiceStatus.
+	/// </summary>
+	public interface IServiceStatus
+	{
+		int Requests
+		{
+			get;
+		}
+
+		State ActualState
+		{
+			get;
+		}
+
+		void ChangeState(State state);
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MyInterfaceImpl.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MyInterfaceImpl.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,69 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for MyInterfaceImpl.
+	/// </summary>
+	public class MyInterfaceImpl : IMyInterface
+	{
+		private String m_name;
+		private bool m_started;
+
+		public MyInterfaceImpl()
+		{
+		}
+
+		#region IMyInterface Members
+
+		public String Name
+		{
+			get
+			{
+				return m_name;
+			}
+			set
+			{
+				m_name = value;
+			}
+		}
+
+		public bool Started
+		{
+			get
+			{
+				return m_started;
+			}
+			set
+			{
+				m_started = value;
+			}
+		}
+
+		public virtual int Calc(int x, int y)
+		{
+			return x + y;
+		}
+
+		public virtual int Calc(int x, int y, int z, Single k)
+		{
+			return x + y + z + (int)k;
+		}
+
+		#endregion
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MySecondInterfaceImpl.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/MySecondInterfaceImpl.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,46 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for MySecondInterfaceImpl.
+	/// </summary>
+	public class MySecondInterfaceImpl : MyInterfaceImpl, IMySecondInterface
+	{
+		private String m_address;
+
+		public MySecondInterfaceImpl()
+		{
+		}
+
+		#region IMySecondInterface Members
+
+		public String Address
+		{
+			get
+			{
+				return m_address;
+			}
+			set
+			{
+				m_address = value;
+			}
+		}
+
+		#endregion
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/ServiceStatusImpl.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ClassInterfaces/ServiceStatusImpl.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,55 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.ClassInterfaces
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for ServiceStatusImpl.
+	/// </summary>
+	public class ServiceStatusImpl : IServiceStatus
+	{
+		private State m_state = State.Invalid;
+
+		public ServiceStatusImpl()
+		{
+		}
+
+		#region IServiceStatus Members
+
+		public int Requests
+		{
+			get
+			{
+				return 10;
+			}
+		}
+
+		public State ActualState
+		{
+			get
+			{
+				return m_state;
+			}
+		}
+
+		public void ChangeState(State state)
+		{
+			m_state = state;
+		}
+
+		#endregion
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/MySerializableClass.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/MySerializableClass.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,30 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.Classes
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for MySerializableClass.
+	/// </summary>
+	[Serializable]
+	public class MySerializableClass
+	{
+		public double CalculateSumDistanceNow()
+		{
+			return Math.PI;
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/NoVirtualMethodClass.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/NoVirtualMethodClass.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,29 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.Classes
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for NoVirtualMethodClass.
+	/// </summary>
+	public class NoVirtualMethodClass
+	{
+		public int Sum(int b1, int b2)
+		{
+			return b1 + b2;
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SealedMethodsClass.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SealedMethodsClass.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,29 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.Classes
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for SealedMethodsClass.
+	/// </summary>
+	public class SealedMethodsClass : ServiceClass
+	{
+		public override sealed int Sum(int b1, int b2)
+		{
+			return b1 + b2;
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/ServiceClass.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/ServiceClass.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,74 @@
+ // Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.Classes
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for ServiceClass.
+	/// </summary>
+	public class ServiceClass
+	{
+		public virtual int Sum(int b1, int b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual byte Sum(byte b1, byte b2)
+		{
+			return System.Convert.ToByte( b1 + b2 );
+		}
+
+		public virtual long Sum(long b1, long b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual short Sum(short b1, short b2)
+		{
+			return (short) (b1 + b2);
+		}
+
+		public virtual float Sum(float b1, float b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual double Sum(double b1, double b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual UInt16 Sum(UInt16 b1, UInt16 b2)
+		{
+			return (UInt16) (b1 + b2);
+		}
+
+		public virtual UInt32 Sum(UInt32 b1, UInt32 b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual UInt64 Sum(UInt64 b1, UInt64 b2)
+		{
+			return b1 + b2;
+		}
+
+		public virtual bool Valid
+		{
+			get { return true; }
+		}
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SpecializedServiceClass.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/Classes/SpecializedServiceClass.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,29 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test.Classes
+{
+	using System;
+
+	/// <summary>
+	/// Summary description for SpecializedServiceClass.
+	/// </summary>
+	public class SpecializedServiceClass : ServiceClass
+	{
+		public virtual int Subtract(int b1, int b2)
+		{
+			return b1 - b2;
+		}
+	}
+}

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CustomProxyGeneratorTestCase.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/CustomProxyGeneratorTestCase.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,96 @@
+using Apache.Avalon.DynamicProxy.Test.Classes;
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test
+{
+	using System;
+	using System.Reflection.Emit;
+
+	using NUnit.Framework;
+
+	using Apache.Avalon.DynamicProxy.Test.ClassInterfaces;
+
+	/// <summary>
+	/// Summary description for CustomProxyGeneratorTestCase.
+	/// </summary>
+	[TestFixture]
+	public class CustomProxyGeneratorTestCase : Assertion
+	{
+		private ProxyGenerator m_generator;
+		private bool m_enhanceInvoked;
+		private bool m_screenInvoked;
+
+		[SetUp]
+		public void Init()
+		{
+			m_generator = new ProxyGenerator();
+			m_enhanceInvoked = false;
+			m_screenInvoked = false;
+		}
+
+		[Test]
+		public void CreateCustomProxy()
+		{
+			GeneratorContext context = new GeneratorContext( 
+				new EnhanceTypeDelegate(EnhanceType),
+				new ScreenInterfacesDelegate(ScreenInterfaces));
+
+			object proxy = m_generator.CreateCustomProxy(
+				typeof (IMyInterface), 
+				new StandardInvocationHandler(new MyInterfaceImpl()), context);
+
+			Assert( m_enhanceInvoked );
+			Assert( m_screenInvoked );
+		}
+
+		[Test]
+		public void CreateCustomClassProxy()
+		{
+			GeneratorContext context = new GeneratorContext( 
+				new EnhanceTypeDelegate(EnhanceType),
+				new ScreenInterfacesDelegate(ScreenInterfaces));
+
+			object proxy = m_generator.CreateCustomClassProxy(
+				typeof (ServiceClass), 
+				new StandardInvocationHandler(new ServiceClass()),
+				context);
+
+			Assert( m_enhanceInvoked );
+			Assert( m_screenInvoked );
+		}
+
+		private void EnhanceType(TypeBuilder mainType, FieldBuilder handlerFieldBuilder, \
ConstructorBuilder constructorBuilder) +		{
+			Assert( !m_enhanceInvoked );
+
+			AssertNotNull(mainType);
+			AssertNotNull(handlerFieldBuilder);
+			AssertNotNull(constructorBuilder);
+
+			m_enhanceInvoked = true;
+		}
+
+		private Type[] ScreenInterfaces(Type[] interfaces)
+		{
+			Assert( !m_screenInvoked );
+
+			AssertNotNull(interfaces);
+
+			m_screenInvoked = true;
+
+			return interfaces;
+		}
+	}
+}
\ No newline at end of file

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ProxyGeneratorTestCase.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/ProxyGeneratorTestCase.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,239 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test
+{
+	using System;
+	using System.Reflection;
+
+	using NUnit.Framework;
+
+	using Apache.Avalon.DynamicProxy;
+	using Apache.Avalon.DynamicProxy.Test.Classes;
+	using Apache.Avalon.DynamicProxy.Test.ClassInterfaces;
+
+	/// <summary>
+	/// Summary description for ProxyGeneratorTestCase.
+	/// </summary>
+	[TestFixture]
+	public class ProxyGeneratorTestCase : Assertion
+	{
+		private ProxyGenerator m_generator;
+
+		[SetUp]
+		public void Init()
+		{
+			m_generator = new ProxyGenerator();
+		}
+
+		[Test]
+		public void ProxyForClass()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(ServiceClass), new ResultModifiedInvocationHandler( new ServiceClass() ) \
); +			
+			AssertNotNull( proxy );
+			Assert( typeof(ServiceClass).IsAssignableFrom( proxy.GetType() ) );
+
+			ServiceClass inter = (ServiceClass) proxy;
+
+			AssertEquals( 44, inter.Sum( 20, 25 ) );
+			AssertEquals( true, inter.Valid );
+		}
+
+		[Test]
+		public void ProxyForClassWithSuperClass()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(SpecializedServiceClass), new ResultModifiedInvocationHandler( new \
SpecializedServiceClass() ) ); +			
+			AssertNotNull( proxy );
+			Assert( typeof(ServiceClass).IsAssignableFrom( proxy.GetType() ) );
+			Assert( typeof(SpecializedServiceClass).IsAssignableFrom( proxy.GetType() ) );
+
+			SpecializedServiceClass inter = (SpecializedServiceClass) proxy;
+
+			AssertEquals( 44, inter.Sum( 20, 25 ) );
+			AssertEquals( -6, inter.Subtract( 20, 25 ) );
+			AssertEquals( true, inter.Valid );
+		}
+
+		[Test]
+		public void ProxyForClassWhichImplementsInterfaces()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(MyInterfaceImpl), new ResultModifiedInvocationHandler( new \
MyInterfaceImpl() ) ); +			
+			AssertNotNull( proxy );
+			Assert( typeof(MyInterfaceImpl).IsAssignableFrom( proxy.GetType() ) );
+			Assert( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) );
+
+			IMyInterface inter = (IMyInterface) proxy;
+
+			AssertEquals( 44, inter.Calc( 20, 25 ) );
+		}
+
+		[Test]
+		public void ProxyingClassWithoutVirtualMethods()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(NoVirtualMethodClass), new ResultModifiedInvocationHandler( new \
SpecializedServiceClass() ) ); +			
+			AssertNotNull( proxy );
+			Assert( typeof(NoVirtualMethodClass).IsAssignableFrom( proxy.GetType() ) );
+
+			NoVirtualMethodClass inter = (NoVirtualMethodClass) proxy;
+
+			AssertEquals( 45, inter.Sum( 20, 25 ) );
+		}
+
+		[Test]
+		public void ProxyingClassWithSealedMethods()
+		{
+			object proxy = m_generator.CreateClassProxy( 
+				typeof(SealedMethodsClass), new ResultModifiedInvocationHandler( new \
SpecializedServiceClass() ) ); +			
+			AssertNotNull( proxy );
+			Assert( typeof(SealedMethodsClass).IsAssignableFrom( proxy.GetType() ) );
+
+			SealedMethodsClass inter = (SealedMethodsClass) proxy;
+
+			AssertEquals( 45, inter.Sum( 20, 25 ) );
+		}
+
+		[Test]
+		public void CreateClassProxyInvalidArguments()
+		{
+			try
+			{
+				m_generator.CreateClassProxy( 
+					typeof(ICloneable), new StandardInvocationHandler( new \
SpecializedServiceClass() ) ); +			}
+			catch(ArgumentException)
+			{
+				// Expected
+			}
+
+			try
+			{
+				m_generator.CreateClassProxy( 
+					null, new StandardInvocationHandler( new SpecializedServiceClass() ) );
+			}
+			catch(ArgumentNullException)
+			{
+				// Expected
+			}
+
+			try
+			{
+				m_generator.CreateClassProxy( 
+					typeof(SpecializedServiceClass), null );
+			}
+			catch(ArgumentNullException)
+			{
+				// Expected
+			}
+		}
+
+		[Test]
+		public void TestGenerationSimpleInterface()
+		{
+			object proxy = m_generator.CreateProxy( 
+				typeof(IMyInterface), new StandardInvocationHandler( new MyInterfaceImpl() ) );
+			
+			AssertNotNull( proxy );
+			Assert( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) );
+
+			IMyInterface inter = (IMyInterface) proxy;
+
+			AssertEquals( 45, inter.Calc( 20, 25 ) );
+
+			inter.Name = "opa";
+			AssertEquals( "opa", inter.Name );
+
+			inter.Started = true;
+			AssertEquals( true, inter.Started );
+		}
+
+		[Test]
+		public void TestGenerationWithInterfaceHeritage()
+		{
+			object proxy = m_generator.CreateProxy( 
+				typeof(IMySecondInterface), new StandardInvocationHandler( new \
MySecondInterfaceImpl() ) ); +
+			AssertNotNull( proxy );
+			Assert( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) );
+			Assert( typeof(IMySecondInterface).IsAssignableFrom( proxy.GetType() ) );
+
+			IMySecondInterface inter = (IMySecondInterface) proxy;
+			inter.Calc(1, 1);
+
+			inter.Name = "hammett";
+			AssertEquals( "hammett", inter.Name );
+
+			inter.Address = "pereira leite, 44";
+			AssertEquals( "pereira leite, 44", inter.Address );
+			
+			AssertEquals( 45, inter.Calc( 20, 25 ) );
+		}
+
+		[Test]
+		public void TestEnumProperties()
+		{
+			ServiceStatusImpl service = new ServiceStatusImpl();
+
+			object proxy = m_generator.CreateProxy( 
+				typeof(IServiceStatus), new StandardInvocationHandler( service ) );
+			
+			AssertNotNull( proxy );
+			Assert( typeof(IServiceStatus).IsAssignableFrom( proxy.GetType() ) );
+
+			IServiceStatus inter = (IServiceStatus) proxy;
+			AssertEquals( State.Invalid, inter.ActualState );
+			
+			inter.ChangeState( State.Valid );
+			AssertEquals( State.Valid, inter.ActualState );
+		}
+
+		public class MyInterfaceProxy : IInvocationHandler
+		{
+			#region IInvocationHandler Members
+
+			public object Invoke(object proxy, MethodInfo method, params object[] arguments)
+			{
+				return null;
+			}
+
+			#endregion
+		}
+	}
+
+	public class ResultModifiedInvocationHandler : StandardInvocationHandler
+	{
+		public ResultModifiedInvocationHandler( object instanceDelegate ) : \
base(instanceDelegate) +		{
+		}
+
+		protected override void PostInvoke(object proxy, System.Reflection.MethodInfo \
method, ref object returnValue, params object[] arguments) +		{
+			if ( returnValue != null && returnValue.GetType() == typeof(int))
+			{
+				int value = (int) returnValue;
+				returnValue = --value;
+			}
+		}
+	}
+}
+
+

Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/SerializableClassTestCase.cs
 ==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/src/DynamicProxyTest/SerializableClassTestCase.cs	Tue \
Sep 28 19:27:47 2004 @@ -0,0 +1,41 @@
+// Copyright 2004 The Apache Software Foundation
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Apache.Avalon.DynamicProxy.Test
+{
+	using System;
+
+	using NUnit.Framework;
+
+      using Apache.Avalon.DynamicProxy.Test.Classes;
+
+	/// <summary>
+	/// Summary description for SerializableClassTestCase.
+	/// </summary>
+	[TestFixture]
+	public class SerializableClassTestCase : Assertion
+	{
+		[Test]
+		public void CreateSerializable()
+		{
+			MySerializableClass myClass = new MySerializableClass();
+
+			ProxyGenerator generator = new ProxyGenerator();
+			MySerializableClass proxy = (MySerializableClass) 
+				generator.CreateClassProxy( typeof(MySerializableClass), new \
StandardInvocationHandler(myClass) ); +
+			Assert( proxy.GetType().IsSerializable );
+		}
+	}
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic