5 // Nick Drochak II (ndrochak@gol.com)
6 // Gonzalo Paniagua (gonzalo@ximian.com)
8 // (C) 2001 Nick Drochak II
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
10 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Globalization;
33 using System.Reflection;
34 using System.Runtime.Remoting;
35 using System.Runtime.Remoting.Activation;
36 using System.Runtime.CompilerServices;
37 using System.Security.Permissions;
38 using System.Security.Policy;
39 using System.Configuration.Assemblies;
43 public sealed class Activator
45 const BindingFlags _flags = BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance;
46 const BindingFlags _accessFlags = BindingFlags.DeclaredOnly | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase |
47 BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public |
55 public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName)
57 if (assemblyName == null)
58 throw new ArgumentNullException ("assemblyName");
61 throw new ArgumentNullException ("typeName");
63 throw new NotImplementedException();
68 public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName,
69 byte []hashValue, AssemblyHashAlgorithm hashAlgorithm)
71 if (assemblyName == null)
72 throw new ArgumentNullException ("assemblyName");
75 throw new ArgumentNullException ("typeName");
77 throw new NotImplementedException();
81 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName)
83 return CreateInstanceFrom (assemblyFile, typeName, null);
86 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, object [] activationAttributes)
88 return Activator.CreateInstanceFrom (assemblyFile, typeName, false, _flags, null, null, null,
89 activationAttributes, null);
92 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
93 BindingFlags bindingAttr, Binder binder, object [] args,
94 CultureInfo culture, object [] activationAttributes,
95 Evidence securityInfo)
97 Assembly assembly = Assembly.LoadFrom (assemblyFile, securityInfo);
101 Type type = assembly.GetType (typeName, true, ignoreCase);
105 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
106 return (obj != null) ? new ObjectHandle (obj) : null;
109 public static ObjectHandle CreateInstance (string assemblyName, string typeName)
111 if (assemblyName == null)
112 assemblyName = Assembly.GetCallingAssembly ().GetName ().Name;
114 return Activator.CreateInstance (assemblyName, typeName, null);
117 public static ObjectHandle CreateInstance (string assemblyName, string typeName, object [] activationAttributes)
119 if (assemblyName == null)
120 assemblyName = Assembly.GetCallingAssembly ().GetName ().Name;
122 return Activator.CreateInstance (assemblyName, typeName, false, _flags, null, null, null,
123 activationAttributes, null);
126 public static ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase,
127 BindingFlags bindingAttr, Binder binder, object [] args,
128 CultureInfo culture, object [] activationAttributes, Evidence securityInfo)
130 Assembly assembly = null;
131 if(assemblyName == null)
132 assembly = Assembly.GetCallingAssembly ();
134 assembly = Assembly.Load (assemblyName, securityInfo);
135 Type type = assembly.GetType (typeName, true, ignoreCase);
136 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
137 return (obj != null) ? new ObjectHandle (obj) : null;
140 public static object CreateInstance (Type type)
142 return CreateInstance (type, false);
145 public static object CreateInstance (Type type, object [] args)
147 return CreateInstance (type, args, new object [0]);
150 public static object CreateInstance (Type type, object [] args, object [] activationAttributes)
153 throw new ArgumentNullException ("type");
156 throw new MemberAccessException (Locale.GetText ("Cannot create an abstract class. Class name: ") +
161 length = args.Length;
163 Type [] atypes = new Type [length];
164 for (int i = 0; i < length; ++i)
165 if (args [i] != null)
166 atypes [i] = args [i].GetType ();
168 ConstructorInfo ctor = type.GetConstructor (atypes);
170 if (type.IsValueType && atypes.Length == 0)
171 return CreateInstanceInternal (type);
173 throw new MissingMethodException (Locale.GetText ("Constructor not found. Class") +
177 if (activationAttributes != null && activationAttributes.Length > 0 && type.IsMarshalByRef) {
178 object newOb = ActivationServices.CreateProxyFromAttributes (type, activationAttributes);
180 return ctor.Invoke (newOb, args);
183 return ctor.Invoke (args);
186 public static object CreateInstance (Type type, BindingFlags bindingAttr, Binder binder, object [] args,
189 return CreateInstance (type, bindingAttr, binder, args, culture, new object [0]);
192 public static object CreateInstance (Type type, BindingFlags bindingAttr, Binder binder, object [] args,
193 CultureInfo culture, object [] activationAttributes)
196 throw new ArgumentNullException ("type");
199 throw new MemberAccessException (Locale.GetText ("Cannot create an abstract class. Class name: ") +
202 // It seems to apply the same rules documented for InvokeMember: "If the type of lookup
203 // is omitted, BindingFlags.Public | BindingFlags.Instance will apply".
204 if ((bindingAttr & _accessFlags) == 0)
205 bindingAttr |= BindingFlags.Public | BindingFlags.Instance;
209 length = args.Length;
211 Type[] atypes = new Type [length];
212 for (int i = 0; i < length; ++i)
213 if (args [i] != null)
214 atypes [i] = args [i].GetType ();
216 ConstructorInfo ctor = type.GetConstructor (bindingAttr, binder, atypes, null);
218 // Not sure about this
219 if (type.IsValueType && atypes.Length == 0) {
220 return CreateInstanceInternal (type);
223 throw new MissingMethodException (Locale.GetText ("Constructor not found. Class: ") +
227 if (activationAttributes != null && activationAttributes.Length > 0 && type.IsMarshalByRef) {
228 object newOb = ActivationServices.CreateProxyFromAttributes (type, activationAttributes);
230 return ctor.Invoke (newOb, bindingAttr, binder, args, culture);
233 return ctor.Invoke (bindingAttr, binder, args, culture);
236 public static object CreateInstance (Type type, bool nonPublic)
239 throw new ArgumentNullException ("type");
242 throw new MemberAccessException (Locale.GetText ("Cannot create an abstract class. Class name: ") +
245 BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
247 flags |= BindingFlags.NonPublic;
249 ConstructorInfo ctor = type.GetConstructor (flags, null, CallingConventions.Any, Type.EmptyTypes, null);
252 if (type.IsValueType)
253 return CreateInstanceInternal (type);
255 throw new MissingMethodException (Locale.GetText ("Default constructor not found."),
256 ".ctor() of " + type.FullName);
259 return ctor.Invoke (null);
262 [SecurityPermission (SecurityAction.LinkDemand, RemotingConfiguration = true)]
263 public static object GetObject (Type type, string url)
265 return RemotingServices.Connect (type, url);
268 [SecurityPermission (SecurityAction.LinkDemand, RemotingConfiguration = true)]
269 public static object GetObject (Type type, string url, object state)
271 return RemotingServices.Connect (type, url, state);
274 [MethodImplAttribute (MethodImplOptions.InternalCall)]
275 internal static extern object CreateInstanceInternal (Type type);