svn commit: rev 46323 - in avalon/trunk/central/laboratory/avalon-net/DynamicProxy: . Builder Builder/CodeGenerators DynamicProxyTest
[email protected] 19 Sep 2004 07:09:32 -0000
| Newsgroups | gmane.comp.jakarta.avalon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: hammett
Date: Sun Sep 19 00:09:31 2004
New Revision: 46323
Added:
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/GeneratorContext.cs (contents, props changed)
Modified:
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Apache.Avalon.DynamicProxy.csproj
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/DefaultProxyBuilder.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/IProxyBuilder.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/DynamicProxyTest/CustomProxyGeneratorTestCase.cs
avalon/trunk/central/laboratory/avalon-net/DynamicProxy/ProxyGenerator.cs
Log:
Bug fixes.
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Apache.Avalon.DynamicProxy.csproj
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Apache.Avalon.DynamicProxy.csproj (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Apache.Avalon.DynamicProxy.csproj Sun Sep 19 00:09:31 2004
@@ -109,6 +109,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Builder\GeneratorContext.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Builder\IProxyBuilder.cs"
SubType = "Code"
BuildAction = "Compile"
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/BaseCodeGenerator.cs Sun Sep 19 00:09:31 2004
@@ -24,33 +24,29 @@
/// </summary>
public abstract class BaseCodeGenerator
{
+ private static readonly String FILE_NAME = "GeneratedAssembly.dll";
+
+ private Type m_baseType = typeof(Object);
+ private AssemblyBuilder m_assemblyBuilder;
private TypeBuilder m_typeBuilder;
private FieldBuilder m_handlerField;
private ConstructorBuilder m_constBuilder;
private IList m_generated = new ArrayList();
- private EnhanceTypeDelegate m_enhanceDelegate;
- private ScreenInterfacesDelegate m_screenInterfacesDelegate;
-
- protected BaseCodeGenerator()
- {
- }
+ private GeneratorContext m_context;
- protected BaseCodeGenerator(EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces)
+ protected BaseCodeGenerator(GeneratorContext context)
{
- m_enhanceDelegate = enhance;
- m_screenInterfacesDelegate = screenInterfaces;
+ m_context = context;
}
- protected EnhanceTypeDelegate EnhanceTypeDelegate
+ protected BaseCodeGenerator() : this(new GeneratorContext())
{
- get { return m_enhanceDelegate; }
}
- protected ScreenInterfacesDelegate ScreenInterfacesDelegate
+ protected GeneratorContext Context
{
- get { return m_screenInterfacesDelegate; }
+ get { return m_context; }
}
protected TypeBuilder MainTypeBuilder
@@ -73,18 +69,30 @@
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "DynamicAssemblyProxyGen";
- AssemblyBuilder assemblyBuilder =
+ ModuleBuilder moduleBuilder = null;
+
+#if (DEBUG)
+ m_assemblyBuilder =
+ AppDomain.CurrentDomain.DefineDynamicAssembly(
+ assemblyName,
+ AssemblyBuilderAccess.RunAndSave);
+ moduleBuilder = m_assemblyBuilder.DefineDynamicModule(assemblyName.Name, FILE_NAME);
+#else
+ m_assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName,
AssemblyBuilderAccess.Run);
+ moduleBuilder = m_assemblyBuilder.DefineDynamicModule(assemblyName.Name, true);
+#endif
- return assemblyBuilder.DefineDynamicModule(assemblyName.Name, true);
+ return moduleBuilder;
}
protected virtual TypeBuilder CreateTypeBuilder(Type baseType, Type[] interfaces)
{
ModuleBuilder moduleBuilder = CreateDynamicModule();
+ m_baseType = baseType;
m_typeBuilder = moduleBuilder.DefineType(
"ProxyType", TypeAttributes.Public | TypeAttributes.Class, baseType, interfaces);
@@ -94,14 +102,52 @@
return m_typeBuilder;
}
+ 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();
+#if (DEBUG)
+ m_assemblyBuilder.Save(FILE_NAME);
+#endif
+ return newType;
+ }
+
/// <summary>
/// Generates a public field holding the <see cref="IInvocationHandler"/>
/// </summary>
/// <returns><see cref="FieldBuilder"/> instance</returns>
protected FieldBuilder GenerateField()
{
- return m_typeBuilder.DefineField("handler",
- typeof (IInvocationHandler), FieldAttributes.Public);
+ 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>
@@ -118,7 +164,7 @@
ILGenerator ilGenerator = consBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
- ilGenerator.Emit(OpCodes.Call, typeof (Object).GetConstructor(new Type[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);
@@ -135,7 +181,10 @@
{
foreach(Type inter in interfaces)
{
- GenerateTypeImplementation(inter, false);
+ if (!Context.ShouldSkip( inter ))
+ {
+ GenerateTypeImplementation(inter, false);
+ }
}
}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/ClassProxyGenerator.cs Sun Sep 19 00:09:31 2004
@@ -25,29 +25,21 @@
{
}
- public ClassProxyGenerator(EnhanceTypeDelegate enhance, ScreenInterfacesDelegate screenInterfaces) :
- base(enhance, screenInterfaces)
+ public ClassProxyGenerator(GeneratorContext context) : base(context)
{
}
public Type GenerateCode(Type baseClass)
{
Type[] interfaces = new Type[0];
-
- if (ScreenInterfacesDelegate != null)
- {
- interfaces = ScreenInterfacesDelegate(interfaces);
- }
+ interfaces = ScreenInterfaces(interfaces);
CreateTypeBuilder( baseClass, interfaces );
GenerateTypeImplementation( baseClass, true );
- if (EnhanceTypeDelegate != null)
- {
- EnhanceTypeDelegate(MainTypeBuilder, HandlerFieldBuilder, DefaultConstructorBuilder);
- }
+ EnhanceType();
- return MainTypeBuilder.CreateType();
+ return CreateType();
}
}
}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/CodeGenerators/InterfaceProxyGenerator.cs Sun Sep 19 00:09:31 2004
@@ -15,8 +15,6 @@
namespace Apache.Avalon.DynamicProxy.Builder.CodeGenerators
{
using System;
- using System.Reflection;
- using System.Reflection.Emit;
/// <summary>
/// Summary description for InterfaceProxyGenerator.
@@ -27,28 +25,21 @@
{
}
- public InterfaceProxyGenerator(EnhanceTypeDelegate enhance, ScreenInterfacesDelegate screenInterfaces) :
- base(enhance, screenInterfaces)
+ public InterfaceProxyGenerator(GeneratorContext context) : base(context)
{
-
}
- public Type GenerateCode(Type[] interfaces)
+ public virtual Type GenerateCode(Type[] interfaces)
{
- if (ScreenInterfacesDelegate != null)
- {
- interfaces = ScreenInterfacesDelegate(interfaces);
- }
+ interfaces = ScreenInterfaces(interfaces);
- CreateTypeBuilder( null, interfaces );
+ CreateTypeBuilder( typeof(Object), interfaces );
GenerateInterfaceImplementation( interfaces );
- if (EnhanceTypeDelegate != null)
- {
- EnhanceTypeDelegate(MainTypeBuilder, HandlerFieldBuilder, DefaultConstructorBuilder);
- }
+ EnhanceType();
- return MainTypeBuilder.CreateType();
+ return CreateType();
}
+
}
}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/DefaultProxyBuilder.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/DefaultProxyBuilder.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/DefaultProxyBuilder.cs Sun Sep 19 00:09:31 2004
@@ -24,29 +24,27 @@
{
#region IProxyBuilder Members
- public Type CreateInterfaceProxy(Type[] interfaces)
+ public virtual Type CreateInterfaceProxy(Type[] interfaces)
{
InterfaceProxyGenerator generator = new InterfaceProxyGenerator();
return generator.GenerateCode( interfaces );
}
- public Type CreateClassProxy(Type theClass)
+ public virtual Type CreateClassProxy(Type theClass)
{
ClassProxyGenerator generator = new ClassProxyGenerator();
return generator.GenerateCode( theClass );
}
- public Type CreateCustomInterfaceProxy(Type[] interfaces, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces)
+ public virtual Type CreateCustomInterfaceProxy(Type[] interfaces, GeneratorContext context)
{
- InterfaceProxyGenerator generator = new InterfaceProxyGenerator(enhance, screenInterfaces);
+ InterfaceProxyGenerator generator = new InterfaceProxyGenerator(context);
return generator.GenerateCode( interfaces );
}
- public Type CreateCustomClassProxy(Type theClass, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces)
+ public virtual Type CreateCustomClassProxy(Type theClass, GeneratorContext context)
{
- ClassProxyGenerator generator = new ClassProxyGenerator(enhance, screenInterfaces);
+ ClassProxyGenerator generator = new ClassProxyGenerator(context);
return generator.GenerateCode( theClass );
}
Added: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/GeneratorContext.cs
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/GeneratorContext.cs Sun Sep 19 00:09:31 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; }
+ }
+ }
+}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/IProxyBuilder.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/IProxyBuilder.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/Builder/IProxyBuilder.cs Sun Sep 19 00:09:31 2004
@@ -23,12 +23,10 @@
{
Type CreateInterfaceProxy( Type[] interfaces );
- Type CreateCustomInterfaceProxy( Type[] interfaces, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces );
+ Type CreateCustomInterfaceProxy( Type[] interfaces, GeneratorContext context );
Type CreateClassProxy( Type theClass );
- Type CreateCustomClassProxy( Type theClass, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces );
+ Type CreateCustomClassProxy( Type theClass, GeneratorContext context );
}
}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/DynamicProxyTest/CustomProxyGeneratorTestCase.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/DynamicProxyTest/CustomProxyGeneratorTestCase.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/DynamicProxyTest/CustomProxyGeneratorTestCase.cs Sun Sep 19 00:09:31 2004
@@ -31,7 +31,6 @@
private ProxyGenerator m_generator;
private bool m_enhanceInvoked;
private bool m_screenInvoked;
- private bool m_constructorInvoked;
[SetUp]
public void Init()
@@ -39,37 +38,37 @@
m_generator = new ProxyGenerator();
m_enhanceInvoked = false;
m_screenInvoked = false;
- m_constructorInvoked = 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()),
- new EnhanceTypeDelegate(EnhanceType),
- new ScreenInterfacesDelegate(ScreenInterfaces),
- new ConstructorArgumentsDelegate(BuildConstructorArguments));
+ new StandardInvocationHandler(new MyInterfaceImpl()), context);
Assert( m_enhanceInvoked );
Assert( m_screenInvoked );
- Assert( m_constructorInvoked );
}
[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()),
- new EnhanceTypeDelegate(EnhanceType),
- new ScreenInterfacesDelegate(ScreenInterfaces),
- new ConstructorArgumentsDelegate(BuildConstructorArguments));
+ context);
Assert( m_enhanceInvoked );
Assert( m_screenInvoked );
- Assert( m_constructorInvoked );
}
private void EnhanceType(TypeBuilder mainType, FieldBuilder handlerFieldBuilder, ConstructorBuilder constructorBuilder)
@@ -92,18 +91,6 @@
m_screenInvoked = true;
return interfaces;
- }
-
- private object[] BuildConstructorArguments(Type generatedType, IInvocationHandler handler)
- {
- Assert( !m_constructorInvoked );
-
- AssertNotNull( generatedType );
- AssertNotNull( handler );
-
- m_constructorInvoked = true;
-
- return new object[] { handler };
}
}
}
Modified: avalon/trunk/central/laboratory/avalon-net/DynamicProxy/ProxyGenerator.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/DynamicProxy/ProxyGenerator.cs (original)
+++ avalon/trunk/central/laboratory/avalon-net/DynamicProxy/ProxyGenerator.cs Sun Sep 19 00:09:31 2004
@@ -23,8 +23,6 @@
public delegate Type[] ScreenInterfacesDelegate( Type[] interfaces );
- public delegate object[] ConstructorArgumentsDelegate( Type generatedType, IInvocationHandler handler );
-
/// <summary>
/// Generates a Java style proxy. This overrides the .Net proxy requirements
/// that forces one to extend MarshalByRefObject or (for a different purpose)
@@ -56,7 +54,7 @@
m_builder = builder;
}
- public ProxyGenerator() : this( new ProxyBuilderImpl() )
+ public ProxyGenerator() : this( new DefaultProxyBuilder() )
{
}
@@ -74,15 +72,13 @@
return CreateProxyInstance( newType, handler );
}
- public virtual object CreateCustomClassProxy(Type baseClass, IInvocationHandler handler,
- EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces,
- ConstructorArgumentsDelegate constructorArguments)
+ public virtual object CreateCustomClassProxy(Type baseClass,
+ IInvocationHandler handler, GeneratorContext context)
{
- AssertCreateClassProxyArguments(baseClass, handler);
+ AssertCreateClassProxyArguments(baseClass, handler, context);
- Type newType = ProxyBuilder.CreateCustomClassProxy(baseClass, enhance, screenInterfaces);
- return CreateCustomProxyInstance( newType, handler, constructorArguments );
+ Type newType = ProxyBuilder.CreateCustomClassProxy(baseClass, context);
+ return CreateProxyInstance( newType, handler, context );
}
/// <summary>
@@ -117,17 +113,13 @@
/// </summary>
/// <param name="theInterface"></param>
/// <param name="handler"></param>
- /// <param name="enhance"></param>
- /// <param name="screenInterfaces"></param>
- /// <param name="constructorArguments"></param>
+ /// <param name="context"></param>
/// <returns></returns>
public virtual object CreateCustomProxy(Type theInterface,
- IInvocationHandler handler, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces,
- ConstructorArgumentsDelegate constructorArguments )
+ IInvocationHandler handler,
+ GeneratorContext context )
{
- return CreateCustomProxy( new Type[] { theInterface }, handler,
- enhance, screenInterfaces, constructorArguments );
+ return CreateCustomProxy( new Type[] { theInterface }, handler, context );
}
/// <summary>
@@ -135,18 +127,14 @@
/// </summary>
/// <param name="interfaces"></param>
/// <param name="handler"></param>
- /// <param name="enhance"></param>
- /// <param name="screenInterfaces"></param>
- /// <param name="constructorArguments"></param>
+ /// <param name="context"></param>
/// <returns></returns>
public virtual object CreateCustomProxy(Type[] interfaces,
- IInvocationHandler handler, EnhanceTypeDelegate enhance,
- ScreenInterfacesDelegate screenInterfaces,
- ConstructorArgumentsDelegate constructorArguments )
- {
- AssertCreateProxyArguments( interfaces, handler);
- Type newType = ProxyBuilder.CreateCustomInterfaceProxy(interfaces, enhance, screenInterfaces);
- return CreateCustomProxyInstance( newType, handler, constructorArguments );
+ 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)
@@ -154,17 +142,9 @@
return Activator.CreateInstance(type, new object[] {handler});
}
- protected virtual object CreateCustomProxyInstance(Type type, IInvocationHandler handler, ConstructorArgumentsDelegate constructorArguments)
+ protected virtual object CreateProxyInstance(Type type, IInvocationHandler handler, GeneratorContext context)
{
- if (constructorArguments != null)
- {
- object[] arguments = constructorArguments( type, handler );
- return Activator.CreateInstance(type, arguments);
- }
- else
- {
- return CreateProxyInstance( type, handler );
- }
+ return CreateProxyInstance( type, handler );
}
protected static void AssertCreateProxyArguments(Type[] interfaces, IInvocationHandler handler)
@@ -183,6 +163,16 @@
}
}
+ 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)
@@ -196,6 +186,15 @@
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");
}
}
}