1 // Copyright 2004-2007 Castle Project - http://www.castleproject.org/
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 namespace Castle
.DynamicProxy
.Builder
.CodeGenerators
19 using System
.Reflection
;
20 using System
.Reflection
.Emit
;
21 using System
.Collections
;
22 using System
.Threading
;
25 /// Summary description for ModuleScope.
28 public class ModuleScope
30 public static readonly String FILE_NAME
= "GeneratedAssembly.dll";
31 public static readonly String ASSEMBLY_NAME
= "DynamicAssemblyProxyGen";
34 /// Avoid leaks caused by non disposal of generated types.
36 private ModuleBuilder _moduleBuilderWithStrongName
= null;
37 private ModuleBuilder _moduleBuilder
= null;
40 /// Keep track of generated types
42 private Hashtable _typeCache
= Hashtable
.Synchronized(new Hashtable());
45 /// Used to lock the module builder creation
47 private object _lockobj
= new object();
49 private ReaderWriterLock readerWriterLock
= new ReaderWriterLock();
51 private AssemblyBuilder _assemblyBuilder
;
53 public ModuleBuilder
ObtainDynamicModule()
55 return ObtainDynamicModule(false);
58 public ModuleBuilder
ObtainDynamicModule(bool signStrongName
)
62 if (signStrongName
&& _moduleBuilderWithStrongName
== null)
64 _moduleBuilderWithStrongName
= CreateModule(signStrongName
);
66 else if(!signStrongName
&& _moduleBuilder
== null)
68 _moduleBuilder
= CreateModule(signStrongName
);
71 return signStrongName
? _moduleBuilderWithStrongName
: _moduleBuilder
;
74 private ModuleBuilder
CreateModule(bool signStrongName
)
76 AssemblyName assemblyName
= new AssemblyName();
77 assemblyName
.Name
= ASSEMBLY_NAME
;
80 assemblyName
.KeyPair
= new StrongNameKeyPair(GetKeyPair());
82 #if ( PHYSICALASSEMBLY )
84 AppDomain
.CurrentDomain
.DefineDynamicAssembly(
86 AssemblyBuilderAccess
.RunAndSave
);
87 _moduleBuilder
= _assemblyBuilder
.DefineDynamicModule(assemblyName
.Name
, FILE_NAME
);
90 AppDomain
.CurrentDomain
.DefineDynamicAssembly(
92 AssemblyBuilderAccess
.Run
);
93 return _assemblyBuilder
.DefineDynamicModule(assemblyName
.Name
, true);
97 public ReaderWriterLock RWLock
99 get { return readerWriterLock; }
102 public void SaveAssembly()
104 #if ( PHYSICALASSEMBLY )
105 _assemblyBuilder
.Save(FILE_NAME
);
109 public Type
this[String name
]
111 get { return _typeCache[name] as Type; }
114 _typeCache
[name
] = value;
119 private static byte[] GetKeyPair()
122 using(Stream stream
= Assembly
.GetExecutingAssembly().GetManifestResourceStream("Castle.DynamicProxy.DynProxy.snk"))
124 int length
= (int)stream
.Length
;
125 keyPair
= new byte[length
];
126 stream
.Read(keyPair
, 0, length
);