public static bool IsSupported <T>() { if (!typeof(T).IsInterface) { throw new ArgumentException("Invalid generic type passed.", nameof(T)); } if (Type.GetTypeFromCLSID(typeof(T).GUID, false) == null) { return(false); } var progId = ComClassProgIdAttribute.GetClassProgId <T>(); if (!string.IsNullOrWhiteSpace(progId) && Type.GetTypeFromProgID(progId, false) == null) { return(false); } return(true); }
public static T CreateInstance <T>() { if (!IsSupported <T>()) { throw new NotSupportedException("This type is not supported in current environment."); } try { var progId = ComClassProgIdAttribute.GetClassProgId <T>(); if (!string.IsNullOrWhiteSpace(progId)) { var typeByProgId = Type.GetTypeFromProgID(progId, false); if (typeByProgId != null) { return((T)Activator.CreateInstance(typeByProgId)); } } var typeByClassId = Type.GetTypeFromCLSID(typeof(T).GUID, false); if (typeByClassId != null) { return((T)Activator.CreateInstance(typeByClassId)); } } catch (COMException e) { throw new NotSupportedException( "Can not create a new instance of this interface in current environment.", e); } throw new NotSupportedException("Can not create a new instance of this interface in current environment."); }