[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