You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2004/03/06 04:29:21 UTC

cvs commit: avalon-sandbox/avalon-net/DynamicProxy/DynamicProxyTest Apache.Avalon.DynamicProxy.Test.csproj AssemblyInfo.cs ProxyGeneratorTestCase.cs

hammett     2004/03/05 19:29:21

  Added:       avalon-net/DynamicProxy Apache.Avalon.DynamicProxy.csproj
                        AssemblyInfo.cs DynamicProxy.sln
                        IInvocationHandler.cs ProxyGenerator.cs
               avalon-net/DynamicProxy/DynamicProxyTest
                        Apache.Avalon.DynamicProxy.Test.csproj
                        AssemblyInfo.cs ProxyGeneratorTestCase.cs
  Log:
  Simple dynamic proxy (java like proxies) for CLI (Mono/.Net)
  
  Revision  Changes    Path
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/Apache.Avalon.DynamicProxy.csproj
  
  Index: Apache.Avalon.DynamicProxy.csproj
  ===================================================================
  <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\Debug\"
                      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\Release\"
                      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"
                  />
              </Include>
          </Files>
      </CSHARP>
  </VisualStudioProject>
  
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/AssemblyInfo.cs
  
  Index: AssemblyInfo.cs
  ===================================================================
  // 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.0")]
  
  #if STRONG
  [assembly: AssemblyDelaySign(false)]
  [assembly: AssemblyKeyFile("../../../../ApacheAvalon.snk")]
  [assembly: AssemblyKeyName("")]
  #endif
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/DynamicProxy.sln
  
  Index: DynamicProxy.sln
  ===================================================================
  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
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/IInvocationHandler.cs
  
  Index: IInvocationHandler.cs
  ===================================================================
  // 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.MethodBase"/> 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, MethodBase method, params object[] arguments);
  	}
  }
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/ProxyGenerator.cs
  
  Index: ProxyGenerator.cs
  ===================================================================
  // 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;
  	using System.Reflection.Emit;
  
  	/// <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>
  	/// <example>
  	/// <code>
  	/// MyInvocationHandler handler = ...
  	/// IInterfaceExposed proxy = 
  	///		ProxyGenerator.CreateProxy( new Type[] { typeof(IInterfaceExposed) }, handler );
  	/// </code>
  	/// </example>
  	public class ProxyGenerator
  	{
  		/// <summary>
  		/// Private construtor
  		/// </summary>
  		private ProxyGenerator()
  		{
  		}
  
  		/// <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 static object CreateProxy(Type[] interfaces, IInvocationHandler handler)
  		{
  			if (interfaces == null)
  			{
  				throw new ArgumentNullException("interfaces");
  			}
  			if (handler == null)
  			{
  				throw new ArgumentNullException("handler");
  			}
  
  			AssemblyName assemblyName = new AssemblyName();
  			assemblyName.Name = "DynamicAssemblyProxyGen";
  
  			AssemblyBuilder assemblyBuilder = 
  				AppDomain.CurrentDomain.DefineDynamicAssembly(
  				assemblyName, 
  				AssemblyBuilderAccess.Run);
  			
  			ModuleBuilder moduleBuilder = 
  				assemblyBuilder.DefineDynamicModule( assemblyName.Name, true );
  
  			TypeBuilder typeBuilder = moduleBuilder.DefineType( 
  				"ProxyType", TypeAttributes.Public|TypeAttributes.Class, null, interfaces);
  
  			foreach(Type inter in interfaces)
  			{
  				GenerateInterfaceImplementation( typeBuilder, inter );
  			}
  
  			Type generatedType = typeBuilder.CreateType();
  
  			return Activator.CreateInstance( generatedType, new object[] { handler } );
  		}
  
  		/// <summary>
  		/// Iterates over the interfaces and generate implementation 
  		/// for each method in it.
  		/// </summary>
  		/// <param name="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <param name="inter">Interface type</param>
  		private static void GenerateInterfaceImplementation( 
  			TypeBuilder typeBuilder, Type inter )
  		{
  			if (!inter.IsInterface)
  			{
  				throw new ArgumentException("Type array expects interfaces only.");
  			}
  
  			FieldBuilder handlerField = GenerateField( typeBuilder );
  			ConstructorBuilder constr = GenerateConstructor( typeBuilder, handlerField );
  
  			PropertyInfo[] properties = inter.GetProperties();
  			PropertyBuilder[] propertiesBuilder = new PropertyBuilder[properties.Length];
  
  			for(int i=0; i < properties.Length; i++)
  			{
  				GeneratePropertyImplementation( typeBuilder, properties[i], ref propertiesBuilder[i] );
  			}
  
  			MethodInfo[] methods = inter.GetMethods();
  
  			foreach(MethodInfo method in methods)
  			{
  				GenerateMethodImplementation( typeBuilder, method, 
  					propertiesBuilder, handlerField, inter );
  			}
  		}
  
  		/// <summary>
  		/// Generates a public field holding the <see cref="IInvocationHandler"/>
  		/// </summary>
  		/// <param name="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <returns><see cref="FieldBuilder"/> instance</returns>
  		private static FieldBuilder GenerateField( TypeBuilder typeBuilder )
  		{
  			return typeBuilder.DefineField( "handler", 
  				typeof(IInvocationHandler), FieldAttributes.Public );
  		}
  
  		/// <summary>
  		/// Generates one public constructor receiving 
  		/// the <see cref="IInvocationHandler"/> instance.
  		/// </summary>
  		/// <param name="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <param name="handlerField"><see cref="FieldBuilder"/> instance representing the handler field</param>
  		/// <returns><see cref="ConstructorBuilder"/> instance</returns>
  		private static ConstructorBuilder GenerateConstructor( 
  			TypeBuilder typeBuilder, FieldBuilder handlerField )
  		{
  			ConstructorBuilder consBuilder = typeBuilder.DefineConstructor(
  				MethodAttributes.Public, 
  				CallingConventions.Standard, 
  				new Type[] { typeof(IInvocationHandler) } );
  			
  			ILGenerator ilGenerator = consBuilder.GetILGenerator();
  			ilGenerator.Emit(OpCodes.Ldarg_0);
  			ilGenerator.Emit(OpCodes.Call, typeof(Object).GetConstructor(new Type[0]));
  			ilGenerator.Emit(OpCodes.Ldarg_0);
  			ilGenerator.Emit(OpCodes.Ldarg_1);
  			ilGenerator.Emit(OpCodes.Stfld, handlerField);
  			ilGenerator.Emit(OpCodes.Ret);
  
  			return consBuilder;
  		}
  
  		/// <summary>
  		/// Generate property implementation
  		/// </summary>
  		/// <param name="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <param name="property"></param>
  		/// <param name="propertyBuilder"></param>
  		private static void GeneratePropertyImplementation( 
  			TypeBuilder typeBuilder, PropertyInfo property, ref PropertyBuilder propertyBuilder )
  		{
  			propertyBuilder = typeBuilder.DefineProperty( 
  				property.Name, property.Attributes, property.PropertyType, null);
  		}
  
  		/// <summary>
  		/// Generates implementation for each method.
  		/// </summary>
  		/// <param name="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <param name="method"></param>
  		/// <param name="properties"></param>
  		private static void GenerateMethodImplementation( 
  			TypeBuilder typeBuilder, MethodInfo method, 
  			PropertyBuilder[] properties, FieldBuilder handlerField, Type inter )
  		{
  			ParameterInfo[] parameterInfo = method.GetParameters();
  
  			System.Type[] parameters = new System.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 = 
  				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( methodBuilder, parameters, handlerField );
  		}
  
  		/// <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="typeBuilder"><see cref="TypeBuilder"/> being constructed.</param>
  		/// <param name="parameters"></param>
  		/// <param name="handlerField"></param>
  		private static void WriteILForMethod( MethodBuilder builder, 
  			System.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.Call, typeof(MethodBase).GetMethod("GetCurrentMethod") );
  
  			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>
  		private static OpCode ConvertTypeToOpCode( Type type )
  		{
  			if ( type.Equals( typeof(Int32) ) )
  			{
  				return OpCodes.Ldind_I4;
  			}
  			else if ( type.Equals( typeof(Int16) ) )
  			{
  				return OpCodes.Ldind_I2;
  			}
  			else if ( type.Equals( typeof(Int64) ) )
  			{
  				return OpCodes.Ldind_I8;
  			}
  			else if ( type.Equals( typeof(Single) ) )
  			{
  				return OpCodes.Ldind_R4;
  			}
  			else if ( type.Equals( typeof(Double) ) )
  			{
  				return OpCodes.Ldind_R8;
  			}
  			else if ( type.Equals( typeof(UInt16) ) )
  			{
  				return OpCodes.Ldind_U2;
  			}
  			else if ( type.Equals( typeof(UInt32) ) )
  			{
  				return OpCodes.Ldind_U4;
  			}
  			else
  			{
  				throw new ArgumentException("Type " + type + " could not be converted to a OpCode");
  			}
  		}
  	}
  }
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/DynamicProxyTest/Apache.Avalon.DynamicProxy.Test.csproj
  
  Index: Apache.Avalon.DynamicProxy.Test.csproj
  ===================================================================
  <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\Debug\"
                      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\Release\"
                      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\NUnit2\bin\nunit.framework.dll"
                  />
              </References>
          </Build>
          <Files>
              <Include>
                  <File
                      RelPath = "AssemblyInfo.cs"
                      SubType = "Code"
                      BuildAction = "Compile"
                  />
                  <File
                      RelPath = "ProxyGeneratorTestCase.cs"
                      SubType = "Code"
                      BuildAction = "Compile"
                  />
              </Include>
          </Files>
      </CSHARP>
  </VisualStudioProject>
  
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/DynamicProxyTest/AssemblyInfo.cs
  
  Index: AssemblyInfo.cs
  ===================================================================
  // 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.0")]
  
  
  
  
  1.1                  avalon-sandbox/avalon-net/DynamicProxy/DynamicProxyTest/ProxyGeneratorTestCase.cs
  
  Index: ProxyGeneratorTestCase.cs
  ===================================================================
  // 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;
  
  	/// <summary>
  	/// Summary description for ProxyGeneratorTestCase.
  	/// </summary>
  	[TestFixture]
  	public class ProxyGeneratorTestCase : Assertion, IInvocationHandler, IMyInterface
  	{
  		protected String nameProperty;
  
  		[Test]
  		public void TestSimpleCase()
  		{
  			object proxy = ProxyGenerator.CreateProxy( new Type[] { typeof(IMyInterface) }, this );
  			AssertNotNull( proxy );
  			Assert( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) );
  
  			IMyInterface inter = (IMyInterface) proxy;
  			inter.Calc(1, "ola");
  			inter.Nome = "opa";
  			AssertEquals( "opa", inter.Nome );
  			AssertEquals( 45, inter.Calc( 20, 25 ) );
  
  		}
  
  		#region IInvocationHandler Members
  
  		public object Invoke(object obj, MethodBase method, params object[] arguments)
  		{
  			Type[] parameters = new Type[arguments.Length];
  			
  			for(int i=0; i < arguments.Length; i++ )
  			{
  				parameters[i] = arguments[i].GetType();
  			}
  
  			MethodInfo ourMethod = this.GetType().GetMethod( method.Name, parameters );
  
  			AssertNotNull( ourMethod );
  			
  			return ourMethod.Invoke( this, arguments );
  		}
  
  		#endregion
  
  		#region IMyInterface Members
  
  		public String Nome
  		{
  			get
  			{
  				return nameProperty;
  			}
  			set
  			{
  				nameProperty = value;
  			}
  		}
  
  		public void Calc(int x, String y)
  		{
  		}
  
  		public void Calc(int x, String y, Single ip)
  		{
  		}
  
  		public int Calc(int x, int y)
  		{
  			return x + y;
  		}
  
  		public int Calc(int x, int y, int z, Single h)
  		{
  			return x + y + z + (int)h;
  		}
  
  		#endregion
  	}
  
  	/// <summary>
  	/// 
  	/// </summary>
  	public interface IMyInterface
  	{
  		String Nome
  		{
  			get;
  			set;
  		}
  
  		void Calc(int x, String y);
  
  		void Calc(int x, String y, Single ip);
  
  		int Calc(int x, int y);
  
  		int Calc(int x, int y, int z, Single h);
  	}
  
  	public class MyTest : IMyInterface
  	{
  		IInvocationHandler handler = null;
  
  		#region IMyInterface Members
  
  		public String Nome
  		{
  			get
  			{
  				// TODO:  Add MyTest.Nome getter implementation
  				return null;
  			}
  			set
  			{
  				// TODO:  Add MyTest.Nome setter implementation
  			}
  		}
  
  		public void Calc(int x, String y)
  		{
  			MethodBase method = MethodBase.GetCurrentMethod();
  			handler.Invoke( this, method, x, y );
  		}
  
  		public void Calc(int x, String y, Single ip)
  		{
  			MethodBase method = MethodBase.GetCurrentMethod();
  			handler.Invoke( this, method, x, y, ip );
  		}
  
  		public int Calc(int x, int y)
  		{
  			MethodBase method = MethodBase.GetCurrentMethod();
  			return (int) handler.Invoke( this, method, x, y );
  		}
  
  		public int Calc(int x, int y, int z, Single h)
  		{
  			MethodBase method = MethodBase.GetCurrentMethod();
  			return (int) handler.Invoke( this, method, x, y, h );
  		}
  
  		#endregion
  
  	}
  
  }
  
  
  
  

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