5 // Nick Drochak II (ndrochak@gol.com)
6 // Gonzalo Paniagua (gonzalo@ximian.com)
7 // Marek Safar (marek.safar@gmail.com)
9 // (C) 2001 Nick Drochak II
10 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
11 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
12 // Copyright (C) 2013 Xamarin Inc (http://www.xamarin.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Globalization;
35 using System.Reflection;
36 using System.Runtime.CompilerServices;
37 using System.Runtime.InteropServices;
38 using System.Security.Permissions;
39 using System.Security.Policy;
40 using System.Configuration.Assemblies;
42 using System.Runtime.Remoting;
43 using System.Runtime.Remoting.Activation;
47 [ClassInterface (ClassInterfaceType.None)]
49 [ComDefaultInterface (typeof (_Activator))]
50 public sealed class Activator : _Activator
52 const BindingFlags _flags = BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance;
53 const BindingFlags _accessFlags = BindingFlags.DeclaredOnly | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase |
54 BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public |
61 [MonoTODO ("No COM support")]
62 public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName)
64 if (assemblyName == null)
65 throw new ArgumentNullException ("assemblyName");
68 throw new ArgumentNullException ("typeName");
70 if (assemblyName.Length == 0)
71 throw new ArgumentException ("assemblyName");
73 throw new NotImplementedException();
76 [MonoTODO("Mono does not support COM")]
77 public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName,
78 byte []hashValue, AssemblyHashAlgorithm hashAlgorithm)
80 if (assemblyName == null)
81 throw new ArgumentNullException ("assemblyName");
84 throw new ArgumentNullException ("typeName");
86 if (assemblyName.Length == 0)
87 throw new ArgumentException ("assemblyName");
89 throw new NotImplementedException();
92 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName)
94 return CreateInstanceFrom (assemblyFile, typeName, null);
97 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, object [] activationAttributes)
99 return Activator.CreateInstanceFrom (assemblyFile, typeName, false, _flags, null, null, null,
100 activationAttributes, null);
106 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
107 BindingFlags bindingAttr, Binder binder, object [] args,
108 CultureInfo culture, object [] activationAttributes,
109 Evidence securityInfo)
111 Assembly assembly = Assembly.LoadFrom (assemblyFile, securityInfo);
112 if (assembly == null)
115 Type type = assembly.GetType (typeName, true, ignoreCase);
119 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
120 return (obj != null) ? new ObjectHandle (obj) : null;
123 public static ObjectHandle CreateInstance (string assemblyName, string typeName)
125 if (assemblyName == null)
126 assemblyName = Assembly.GetCallingAssembly ().GetName ().Name;
128 return Activator.CreateInstance (assemblyName, typeName, null);
131 public static ObjectHandle CreateInstance (string assemblyName, string typeName, object [] activationAttributes)
133 if (assemblyName == null)
134 assemblyName = Assembly.GetCallingAssembly ().GetName ().Name;
136 return Activator.CreateInstance (assemblyName, typeName, false, _flags, null, null, null,
137 activationAttributes, null);
143 public static ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase,
144 BindingFlags bindingAttr, Binder binder, object [] args,
145 CultureInfo culture, object [] activationAttributes, Evidence securityInfo)
147 Assembly assembly = null;
148 if(assemblyName == null)
149 assembly = Assembly.GetCallingAssembly ();
151 assembly = Assembly.Load (assemblyName, securityInfo);
152 Type type = assembly.GetType (typeName, true, ignoreCase);
153 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
154 return (obj != null) ? new ObjectHandle (obj) : null;
157 [MonoNotSupported ("no ClickOnce in mono")]
158 public static ObjectHandle CreateInstance (ActivationContext activationContext)
160 throw new NotImplementedException ();
163 [MonoNotSupported ("no ClickOnce in mono")]
164 public static ObjectHandle CreateInstance (ActivationContext activationContext, string [] activationCustomData)
166 throw new NotImplementedException ();
169 // Cross-domain instance creation
171 public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName)
174 throw new ArgumentNullException ("domain");
175 return domain.CreateInstanceFrom (assemblyFile, typeName);
182 public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName,
183 bool ignoreCase, BindingFlags bindingAttr, Binder binder,
184 object [] args, CultureInfo culture,
185 object [] activationAttributes,
186 Evidence securityAttributes)
189 throw new ArgumentNullException ("domain");
191 return domain.CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes, securityAttributes);
194 public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName)
197 throw new ArgumentNullException ("domain");
198 return domain.CreateInstance (assemblyName, typeName);
204 public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName,
205 bool ignoreCase, BindingFlags bindingAttr, Binder binder,
206 object [] args, CultureInfo culture,
207 object [] activationAttributes,
208 Evidence securityAttributes)
211 throw new ArgumentNullException ("domain");
212 return domain.CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes, securityAttributes);
215 public static T CreateInstance <T> ()
217 return (T) CreateInstance (typeof (T));
220 public static object CreateInstance (Type type)
222 return CreateInstance (type, false);
225 public static object CreateInstance (Type type, params object [] args)
227 return CreateInstance (type, args, EmptyArray<object>.Value);
230 public static object CreateInstance (Type type, object [] args, object [] activationAttributes)
232 return CreateInstance (type, BindingFlags.Default, Binder.DefaultBinder, args, null, activationAttributes);
235 public static object CreateInstance (Type type, BindingFlags bindingAttr, Binder binder, object [] args,
238 return CreateInstance (type, bindingAttr, binder, args, culture, EmptyArray<object>.Value);
241 public static object CreateInstance (Type type, BindingFlags bindingAttr, Binder binder, object [] args,
242 CultureInfo culture, object [] activationAttributes)
246 if (type.ContainsGenericParameters)
247 throw new ArgumentException (type + " is an open generic type", "type");
249 // It seems to apply the same rules documented for InvokeMember: "If the type of lookup
250 // is omitted, BindingFlags.Public | BindingFlags.Instance will apply".
251 if ((bindingAttr & _accessFlags) == 0)
252 bindingAttr |= BindingFlags.Public | BindingFlags.Instance;
255 binder = Binder.DefaultBinder;
258 ConstructorInfo ctor = (ConstructorInfo) binder.BindToMethod (bindingAttr, type.GetConstructors (bindingAttr), ref args, null, null, null, out state);
261 // Not sure about this
262 if (type.IsValueType && (args == null || args.Length == 0)) {
263 return CreateInstanceInternal (type);
266 var sb = new StringBuilder ();
268 for (int i = 0; i < args.Length; i++) {
272 var argument = args [i];
273 var arg_type = argument != null ? argument.GetType () : null;
274 sb.Append (arg_type != null ? arg_type.ToString () : "(unknown)");
278 throw new MissingMethodException (String.Format (Locale.GetText ("No constructor found for {0}::.ctor({1})"),
282 CheckAbstractType (type);
284 if (activationAttributes != null && activationAttributes.Length > 0) {
286 throw new NotSupportedException ("Activation attributes are not supported");
288 if (!type.IsMarshalByRef) {
289 string msg = Locale.GetText ("Type '{0}' doesn't derive from MarshalByRefObject.", type.FullName);
290 throw new NotSupportedException (msg);
292 object newOb = ActivationServices.CreateProxyFromAttributes (type, activationAttributes);
295 ctor.Invoke (newOb, bindingAttr, binder, args, culture);
301 return ctor.Invoke (bindingAttr, binder, args, culture);
304 public static object CreateInstance (Type type, bool nonPublic)
308 if (type.ContainsGenericParameters)
309 throw new ArgumentException (type + " is an open generic type", "type");
311 MonoType monoType = type.UnderlyingSystemType as MonoType;
312 if (monoType == null)
313 throw new ArgumentException ("Type must be a type provided by the runtime");
315 CheckAbstractType (monoType);
317 var ctor = monoType.GetDefaultConstructor ();
318 if (!nonPublic && ctor != null && !ctor.IsPublic) {
323 if (type.IsValueType)
324 return CreateInstanceInternal (type);
326 throw new MissingMethodException (Locale.GetText ("Default constructor not found for type " + type.FullName));
329 return ctor.InternalInvoke (null, null);
332 private static void CheckType (Type type)
335 throw new ArgumentNullException ("type");
337 if ((type == typeof (TypedReference)) || (type == typeof (ArgIterator)) || (type == typeof (void)) ||
338 (type == typeof (RuntimeArgumentHandle))) {
339 string msg = Locale.GetText ("CreateInstance cannot be used to create this type ({0}).", type.FullName);
340 throw new NotSupportedException (msg);
344 private static void CheckAbstractType (Type type)
346 if (type.IsAbstract) {
347 string msg = Locale.GetText ("Cannot create an abstract class '{0}'.", type.FullName);
348 throw new MissingMethodException (msg);
352 [SecurityPermission (SecurityAction.LinkDemand, RemotingConfiguration = true)]
353 public static object GetObject (Type type, string url)
356 throw new ArgumentNullException ("type");
358 return RemotingServices.Connect (type, url);
361 [SecurityPermission (SecurityAction.LinkDemand, RemotingConfiguration = true)]
362 public static object GetObject (Type type, string url, object state)
365 throw new ArgumentNullException ("type");
367 return RemotingServices.Connect (type, url, state);
370 [MethodImplAttribute (MethodImplOptions.InternalCall)]
371 internal static extern object CreateInstanceInternal (Type type);
373 void _Activator.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
375 throw new NotImplementedException ();
378 void _Activator.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
380 throw new NotImplementedException ();
383 void _Activator.GetTypeInfoCount (out uint pcTInfo)
385 throw new NotImplementedException ();
388 void _Activator.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
389 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
391 throw new NotImplementedException ();
395 public static ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase,
396 BindingFlags bindingAttr, Binder binder, object [] args,
397 CultureInfo culture, object [] activationAttributes)
399 Assembly assembly = null;
400 if(assemblyName == null)
401 assembly = Assembly.GetCallingAssembly ();
403 assembly = Assembly.Load (assemblyName);
404 Type type = assembly.GetType (typeName, true, ignoreCase);
405 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
406 return (obj != null) ? new ObjectHandle (obj) : null;
409 public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName,
410 bool ignoreCase, BindingFlags bindingAttr, Binder binder,
411 object [] args, CultureInfo culture,
412 object [] activationAttributes)
415 throw new ArgumentNullException ("domain");
416 return domain.CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes);
419 public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
420 BindingFlags bindingAttr, Binder binder, object [] args,
421 CultureInfo culture, object [] activationAttributes)
423 Assembly assembly = Assembly.LoadFrom (assemblyFile);
424 if (assembly == null)
427 Type type = assembly.GetType (typeName, true, ignoreCase);
431 object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
432 return (obj != null) ? new ObjectHandle (obj) : null;
435 public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName,
436 bool ignoreCase, BindingFlags bindingAttr, Binder binder,
437 object [] args, CultureInfo culture,
438 object [] activationAttributes)
441 throw new ArgumentNullException ("domain");
443 return domain.CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes);