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