using System.Globalization;
using System.Reflection;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Activation;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Security.Policy;
using System.Configuration.Assemblies;
+using System.Text;
+#if !MOONLIGHT
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Activation;
+#endif
namespace System
{
[ClassInterface (ClassInterfaceType.None)]
-#if NET_2_0
[ComVisible (true)]
[ComDefaultInterface (typeof (_Activator))]
-#endif
public sealed class Activator : _Activator
{
const BindingFlags _flags = BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance;
{
}
- [MonoTODO]
+#if !MOONLIGHT
+ [MonoTODO ("No COM support")]
public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName)
{
if (assemblyName == null)
throw new NotImplementedException();
}
-#if NET_1_1
- [MonoTODO]
+ [MonoTODO("Mono does not support COM")]
public static ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName,
byte []hashValue, AssemblyHashAlgorithm hashAlgorithm)
{
throw new NotImplementedException();
}
-#endif
public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName)
{
activationAttributes, null);
}
+#if NET_4_0
+ [Obsolete]
+#endif
public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
BindingFlags bindingAttr, Binder binder, object [] args,
CultureInfo culture, object [] activationAttributes,
activationAttributes, null);
}
+#if NET_4_0
+ [Obsolete]
+#endif
public static ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase,
BindingFlags bindingAttr, Binder binder, object [] args,
CultureInfo culture, object [] activationAttributes, Evidence securityInfo)
return (obj != null) ? new ObjectHandle (obj) : null;
}
-#if NET_2_0
+ [MonoNotSupported ("no ClickOnce in mono")]
+ public static ObjectHandle CreateInstance (ActivationContext activationContext)
+ {
+ throw new NotImplementedException ();
+ }
+
+ [MonoNotSupported ("no ClickOnce in mono")]
+ public static ObjectHandle CreateInstance (ActivationContext activationContext, string [] activationCustomData)
+ {
+ throw new NotImplementedException ();
+ }
+
+ // Cross-domain instance creation
+
+ public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+ return domain.CreateInstanceFrom (assemblyFile, typeName);
+ }
+
+
+#if NET_4_0
+ [Obsolete]
+#endif
+ public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName,
+ bool ignoreCase, BindingFlags bindingAttr, Binder binder,
+ object [] args, CultureInfo culture,
+ object [] activationAttributes,
+ Evidence securityAttributes)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+
+ return domain.CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes, securityAttributes);
+ }
+
+ public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+ return domain.CreateInstance (assemblyName, typeName);
+ }
+
+#if NET_4_0
+ [Obsolete]
+#endif
+ public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName,
+ bool ignoreCase, BindingFlags bindingAttr, Binder binder,
+ object [] args, CultureInfo culture,
+ object [] activationAttributes,
+ Evidence securityAttributes)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+ return domain.CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes, securityAttributes);
+ }
+#endif // !NET_2_1
+
public static T CreateInstance <T> ()
{
return (T) CreateInstance (typeof (T));
}
-#endif
public static object CreateInstance (Type type)
{
{
CheckType (type);
-#if NET_2_0
if (type.ContainsGenericParameters)
throw new ArgumentException (type + " is an open generic type", "type");
-#endif
+
// It seems to apply the same rules documented for InvokeMember: "If the type of lookup
// is omitted, BindingFlags.Public | BindingFlags.Instance will apply".
if ((bindingAttr & _accessFlags) == 0)
return CreateInstanceInternal (type);
}
- throw new MissingMethodException (Locale.GetText ("Constructor not found. Class: ") +
- type.FullName);
+ StringBuilder sb = new StringBuilder ();
+ foreach (Type t in atypes){
+ sb.Append (t != null ? t.ToString () : "(unknown)");
+ sb.Append (", ");
+ }
+ if (sb.Length > 2)
+ sb.Length -= 2;
+
+ throw new MissingMethodException (String.Format (Locale.GetText ("No constructor found for {0}::.ctor({1})"),
+ type.FullName, sb));
}
CheckAbstractType (type);
-
+#if !MOONLIGHT
if (activationAttributes != null && activationAttributes.Length > 0) {
if (!type.IsMarshalByRef) {
string msg = Locale.GetText ("Type '{0}' doesn't derive from MarshalByRefObject.", type.FullName);
throw new NotSupportedException (msg);
}
object newOb = ActivationServices.CreateProxyFromAttributes (type, activationAttributes);
- if (newOb != null)
- return ctor.Invoke (newOb, bindingAttr, binder, args, culture);
+ if (newOb != null) {
+ // This returns null
+ ctor.Invoke (newOb, bindingAttr, binder, args, culture);
+ return newOb;
+ }
}
-
+#endif
return ctor.Invoke (bindingAttr, binder, args, culture);
}
public static object CreateInstance (Type type, bool nonPublic)
{
CheckType (type);
-#if NET_2_0
+
if (type.ContainsGenericParameters)
throw new ArgumentException (type + " is an open generic type", "type");
-#endif
- CheckAbstractType (type);
- BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
- if (nonPublic)
- flags |= BindingFlags.NonPublic;
+ CheckAbstractType (type);
- ConstructorInfo ctor = type.GetConstructor (flags, null, CallingConventions.Any, Type.EmptyTypes, null);
+ ConstructorInfo ctor;
+ MonoType monoType = type as MonoType;
+
+ if (monoType != null) {
+ ctor = monoType.GetDefaultConstructor ();
+ if (!nonPublic && ctor != null && !ctor.IsPublic)
+ ctor = null;
+ } else {
+ BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
+ if (nonPublic)
+ flags |= BindingFlags.NonPublic;
+ ctor = type.GetConstructor (flags, null, CallingConventions.Any, Type.EmptyTypes, null);
+ }
if (ctor == null) {
if (type.IsValueType)
return CreateInstanceInternal (type);
- throw new MissingMethodException (Locale.GetText ("Default constructor not found."),
- ".ctor() of " + type.FullName);
+ throw new MissingMethodException (Locale.GetText ("Default constructor not found for type " +
+ type.FullName + "."));
}
return ctor.Invoke (null);
{
if (type.IsAbstract) {
string msg = Locale.GetText ("Cannot create an abstract class '{0}'.", type.FullName);
-#if NET_2_0
throw new MissingMethodException (msg);
-#else
- throw new MemberAccessException (msg);
-#endif
}
}
+#if !MOONLIGHT
[SecurityPermission (SecurityAction.LinkDemand, RemotingConfiguration = true)]
public static object GetObject (Type type, string url)
{
return RemotingServices.Connect (type, url, state);
}
-
+#endif
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern object CreateInstanceInternal (Type type);
-#if NET_1_1
void _Activator.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
{
throw new NotImplementedException ();
{
throw new NotImplementedException ();
}
+
+#if NET_4_0
+ public static ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase,
+ BindingFlags bindingAttr, Binder binder, object [] args,
+ CultureInfo culture, object [] activationAttributes)
+ {
+ Assembly assembly = null;
+ if(assemblyName == null)
+ assembly = Assembly.GetCallingAssembly ();
+ else
+ assembly = Assembly.Load (assemblyName);
+ Type type = assembly.GetType (typeName, true, ignoreCase);
+ object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
+ return (obj != null) ? new ObjectHandle (obj) : null;
+ }
+
+ public static ObjectHandle CreateInstance (AppDomain domain, string assemblyName, string typeName,
+ bool ignoreCase, BindingFlags bindingAttr, Binder binder,
+ object [] args, CultureInfo culture,
+ object [] activationAttributes)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+ return domain.CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes);
+ }
+
+ public static ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
+ BindingFlags bindingAttr, Binder binder, object [] args,
+ CultureInfo culture, object [] activationAttributes)
+ {
+ Assembly assembly = Assembly.LoadFrom (assemblyFile);
+ if (assembly == null)
+ return null;
+
+ Type type = assembly.GetType (typeName, true, ignoreCase);
+ if (type == null)
+ return null;
+
+ object obj = CreateInstance (type, bindingAttr, binder, args, culture, activationAttributes);
+ return (obj != null) ? new ObjectHandle (obj) : null;
+ }
+
+ public static ObjectHandle CreateInstanceFrom (AppDomain domain, string assemblyFile, string typeName,
+ bool ignoreCase, BindingFlags bindingAttr, Binder binder,
+ object [] args, CultureInfo culture,
+ object [] activationAttributes)
+ {
+ if (domain == null)
+ throw new ArgumentNullException ("domain");
+
+ return domain.CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args, culture, activationAttributes);
+ }
#endif
}
}