Прочитать на английском

Поделиться через


Type.GetTypeFromCLSID Метод

Определение

Возвращает тип, связанный с заданным кодом CLSID.

Перегрузки

GetTypeFromCLSID(Guid)

Возвращает тип, связанный с заданным кодом CLSID.

GetTypeFromCLSID(Guid, Boolean)

Возвращает тип, связанный с заданным кодом CLSID, позволяющий определить, будет ли выбрасываться исключение в случае происхождения ошибки при загрузке типа.

GetTypeFromCLSID(Guid, String)

Возвращает с указанного сервера тип, связанный с заданным кодом CLSID.

GetTypeFromCLSID(Guid, String, Boolean)

Возвращает с указанного сервера тип, связанный с заданным кодом CLSID, позволяющий определить, будет ли выбрасываться исключение при происхождении ошибки во время загрузки типа.

GetTypeFromCLSID(Guid)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

Возвращает тип, связанный с заданным кодом CLSID.

public static Type? GetTypeFromCLSID (Guid clsid);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static Type? GetTypeFromCLSID (Guid clsid);
public static Type GetTypeFromCLSID (Guid clsid);

Параметры

clsid
Guid

Код CLSID извлекаемого типа.

Возвращаемое значение

System.__ComObject вне зависимости от того, допустим ли код CLSID.

Атрибуты

Примеры

В следующем примере используется ИДЕНТИФИКАТОР CLSID объекта Приложения Microsoft Word для получения типа COM, представляющего приложение Microsoft Word. Затем он создает экземпляр типа, вызывая Activator.CreateInstance метод , и закрывает его, вызывая метод Application.Quit .

using System;
using System.Reflection;
using System.Runtime.InteropServices;

public class Example
{
   private const string WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}";
   
   public static void Main()
   {
      // Start an instance of the Word application.
      var word = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID));
      Console.WriteLine("Instantiated Type object from CLSID {0}",
                        WORD_CLSID);
      Object wordObj = Activator.CreateInstance(word);
      Console.WriteLine("Instantiated {0}", 
                        wordObj.GetType().FullName);
      
      // Close Word.
      word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, 
                        wordObj, new object[] { 0, 0, false } );
   }
}
// The example displays the following output:
//    Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
//    Instantiated Microsoft.Office.Interop.Word.ApplicationClass

Комментарии

Метод GetTypeFromCLSID поддерживает доступ с поздней привязкой к неуправляемым COM-объектам из платформа .NET Framework приложений, если вы знаете идентификатор класса (CLSID) com-объекта. Идентификатор класса для COM-классов определен в HKEY_CLASSES_ROOT\CLSID разделе реестра. Вы можете получить значение свойства , IsCOMObject чтобы определить, является ли тип, возвращаемый этим методом, COM-объектом.

Совет

Метод можно вызвать GetTypeFromProgID для доступа с поздней привязкой к COM-объектам, программный идентификатор которых (ProgID) вы знаете.

Создание экземпляра неуправляемого COM-объекта из clSID состоит из двух этапов:

  1. Type Получите объект , представляющий__ComObject объект , соответствующий идентификатору CLSID, вызвав GetTypeFromCLSID метод .

  2. Activator.CreateInstance(Type) Вызовите метод для создания экземпляра COM-объекта.

Пример см. в качестве иллюстрации.

Перегрузка GetTypeFromCLSID(Guid) игнорирует любое исключение, которое может возникнуть при создании экземпляра Type объекта на основе аргумента clsid . Обратите внимание, что исключение не создается, если clsid не найден в реестре.

Примечания для тех, кто вызывает этот метод

Этот метод предназначен для использования при работе с COM-объектами, а не с платформа .NET Framework объектами. Все управляемые объекты, в том числе видимые для COM (то есть их ComVisibleAttribute атрибут — true), имеют GUID, возвращаемый свойством GUID . Хотя метод возвращает объект, соответствующий Type GUID для платформа .NET Framework объектов, этот объект нельзя использовать для Type создания экземпляра типа путем вызова CreateInstance(Type) метода , как показано в следующем примере.

using System;
using System.Runtime.InteropServices;

[assembly:ComVisible(true)]

// Define two classes, and assign one an explicit GUID.
[GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")]
public class ExplicitGuid
{ }

public class NoExplicitGuid
{ }

public class Example
{
   public static void Main()
   {
      Type explicitType = typeof(ExplicitGuid);
      Guid explicitGuid = explicitType.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type explicitCOM = Type.GetTypeFromCLSID(explicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        explicitCOM.Name, explicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        explicitType.Name, explicitCOM.Name,
                        explicitType.Equals(explicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(explicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      } 
        
      Type notExplicit = typeof(NoExplicitGuid);
      Guid notExplicitGuid = notExplicit.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        notExplicitCOM.Name, notExplicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        notExplicit.Name, notExplicitCOM.Name,
                        notExplicit.Equals(notExplicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(notExplicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      }   
   }
}
// The example displays the following output:
//       Created __ComObject type from CLSID d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4
//       ExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {D055CBA3-1F83-4BD7-BA19-E22B1B8EC3C4} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
//       
//       Created __ComObject type from CLSID 74f03346-a718-3516-ac78-f351c7459ffb
//       NoExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {74F03346-A718-3516-AC78-F351C7459FFB} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Вместо этого GetTypeFromCLSID(Guid, String, Boolean) следует использовать только для получения GUID неуправляемого COM-объекта, а результирующий Type объект, передаваемый CreateInstance(Type) в метод, должен представлять неуправляемый COM-объект.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

GetTypeFromCLSID(Guid, Boolean)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

Возвращает тип, связанный с заданным кодом CLSID, позволяющий определить, будет ли выбрасываться исключение в случае происхождения ошибки при загрузке типа.

public static Type? GetTypeFromCLSID (Guid clsid, bool throwOnError);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static Type? GetTypeFromCLSID (Guid clsid, bool throwOnError);
public static Type GetTypeFromCLSID (Guid clsid, bool throwOnError);

Параметры

clsid
Guid

Код CLSID извлекаемого типа.

throwOnError
Boolean

Значение true для вызова любого возникшего исключения.

-или-

Значение false для игнорирования всех происходящих исключений.

Возвращаемое значение

System.__ComObject вне зависимости от того, допустим ли код CLSID.

Атрибуты

Примеры

В следующем примере используется ИДЕНТИФИКАТОР CLSID объекта Приложения Microsoft Word для получения типа COM, представляющего приложение Microsoft Word. Затем он создает экземпляр типа, вызывая Activator.CreateInstance метод , и закрывает его, вызывая метод Application.Quit . Исключение возникает, если при загрузке типа возникает ошибка.

using System;
using System.Reflection;
using System.Runtime.InteropServices;

public class Example
{
   private const string WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}";
   
   public static void Main()
   {
      try {
         // Start an instance of the Word application.
         var word = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID), true);
         Console.WriteLine("Instantiated Type object from CLSID {0}",
                           WORD_CLSID);
         Object wordObj = Activator.CreateInstance(word);
         Console.WriteLine("Instantiated {0}", 
                           wordObj.GetType().FullName, WORD_CLSID);
         
         // Close Word.
         word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, 
                           wordObj, new object[] { 0, 0, false } );
      }
      catch (Exception) {
         Console.WriteLine("Unable to instantiate an object for {0}", WORD_CLSID);
      }
   }
}
// The example displays the following output:
//    Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
//    Instantiated Microsoft.Office.Interop.Word.ApplicationClass

Комментарии

Метод GetTypeFromCLSID поддерживает доступ с поздней привязкой к неуправляемым COM-объектам из платформа .NET Framework приложений, если вы знаете идентификатор класса (CLSID) com-объекта. Идентификатор класса для COM-классов определен в HKEY_CLASSES_ROOT\CLSID разделе реестра. Вы можете получить значение свойства , IsCOMObject чтобы определить, является ли тип, возвращаемый этим методом, COM-объектом.

Совет

Метод можно вызвать GetTypeFromProgID для доступа с поздней привязкой к COM-объектам, программный идентификатор которых (ProgID) вы знаете.

Создание экземпляра неуправляемого COM-объекта из clSID состоит из двух этапов:

  1. Type Получите объект , представляющий __ComObject объект , соответствующий идентификатору CLSID, вызвав GetTypeFromCLSID метод .

  2. Activator.CreateInstance(Type) Вызовите метод для создания экземпляра COM-объекта.

Пример см. в качестве иллюстрации.

При указании truethrowOnErrorдля будут возникать исключения, такие как OutOfMemoryException , но для незарегистрированных идентификаторов CLSID это не приведет к сбою.

Примечания для тех, кто вызывает этот метод

Этот метод предназначен для использования при работе с COM-объектами, а не с платформа .NET Framework объектами. Все управляемые объекты, в том числе видимые для COM (то есть их ComVisibleAttribute атрибут — true), имеют GUID, возвращаемый свойством GUID . Хотя метод возвращает объект, соответствующий Type GUID для платформа .NET Framework объектов, этот объект нельзя использовать для Type создания экземпляра типа путем вызова CreateInstance(Type) метода , как показано в следующем примере.

using System;
using System.Runtime.InteropServices;

[assembly:ComVisible(true)]

// Define two classes, and assign one an explicit GUID.
[GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")]
public class ExplicitGuid
{ }

public class NoExplicitGuid
{ }

public class Example
{
   public static void Main()
   {
      Type explicitType = typeof(ExplicitGuid);
      Guid explicitGuid = explicitType.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type explicitCOM = Type.GetTypeFromCLSID(explicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        explicitCOM.Name, explicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        explicitType.Name, explicitCOM.Name,
                        explicitType.Equals(explicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(explicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      } 
        
      Type notExplicit = typeof(NoExplicitGuid);
      Guid notExplicitGuid = notExplicit.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        notExplicitCOM.Name, notExplicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        notExplicit.Name, notExplicitCOM.Name,
                        notExplicit.Equals(notExplicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(notExplicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      }   
   }
}
// The example displays the following output:
//       Created __ComObject type from CLSID d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4
//       ExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {D055CBA3-1F83-4BD7-BA19-E22B1B8EC3C4} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
//       
//       Created __ComObject type from CLSID 74f03346-a718-3516-ac78-f351c7459ffb
//       NoExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {74F03346-A718-3516-AC78-F351C7459FFB} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Вместо этого GetTypeFromCLSID(Guid, String, Boolean) следует использовать только для получения GUID неуправляемого COM-объекта, а результирующий Type объект, передаваемый CreateInstance(Type) в метод, должен представлять неуправляемый COM-объект.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

GetTypeFromCLSID(Guid, String)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

Возвращает с указанного сервера тип, связанный с заданным кодом CLSID.

public static Type? GetTypeFromCLSID (Guid clsid, string? server);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static Type? GetTypeFromCLSID (Guid clsid, string? server);
public static Type GetTypeFromCLSID (Guid clsid, string server);

Параметры

clsid
Guid

Код CLSID извлекаемого типа.

server
String

Сервер, с которого должен быть загружен тип. Если в качестве имени сервера задано значение null, этот метод автоматически перейдет к поиску на локальном компьютере.

Возвращаемое значение

System.__ComObject вне зависимости от того, допустим ли код CLSID.

Атрибуты

Примеры

В следующем примере используется ИДЕНТИФИКАТОР CLSID объекта Приложения Microsoft Word для получения типа COM, представляющего приложение Microsoft Word, с сервера с именем computer17.central.contoso.com. Затем он создает экземпляр типа, вызывая Activator.CreateInstance метод , и закрывает его, вызывая метод Application.Quit .

using System;
using System.Reflection;
using System.Runtime.InteropServices;

public class Example
{
   private const string WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}";
   
   public static void Main()
   {
      // Start an instance of the Word application.
      var word = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID), "computer17.central.contoso.com");
      Console.WriteLine("Instantiated Type object from CLSID {0}",
                        WORD_CLSID);
      try {
         Object wordObj = Activator.CreateInstance(word);
         Console.WriteLine("Instantiated {0}", 
                           wordObj.GetType().FullName, WORD_CLSID);
            
         // Close Word.
         word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, 
                           wordObj, new object[] { 0, 0, false } );
      }
      catch (COMException) {
         Console.WriteLine("Unable to instantiate object.");   
      }
   }
}
// The example displays the following output:
//    Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
//    Instantiated Microsoft.Office.Interop.Word.ApplicationClass

Комментарии

Метод GetTypeFromCLSID поддерживает доступ с поздней привязкой к неуправляемым COM-объектам из платформа .NET Framework приложений, если вы знаете идентификатор класса (CLSID) com-объекта. Идентификатор класса для COM-классов определен в HKEY_CLASSES_ROOT\CLSID разделе реестра. Вы можете получить значение свойства , IsCOMObject чтобы определить, является ли тип, возвращаемый этим методом, COM-объектом.

Совет

Метод можно вызвать GetTypeFromProgID для доступа с поздней привязкой к COM-объектам, программный идентификатор которых (ProgID) вы знаете.

Создание экземпляра неуправляемого COM-объекта из clSID состоит из двух этапов:

  1. Type Получите объект , представляющий __ComObject объект , соответствующий идентификатору CLSID, вызвав GetTypeFromCLSID метод .

  2. Activator.CreateInstance(Type) Вызовите метод для создания экземпляра COM-объекта.

Примечания для тех, кто вызывает этот метод

Этот метод предназначен для использования при работе с COM-объектами, а не с платформа .NET Framework объектами. Все управляемые объекты, в том числе видимые для COM (то есть их ComVisibleAttribute атрибут — true), имеют GUID, возвращаемый свойством GUID . Хотя метод возвращает объект, соответствующий Type GUID для платформа .NET Framework объектов, этот объект нельзя использовать для Type создания экземпляра типа путем вызова CreateInstance(Type) метода , как показано в следующем примере.

using System;
using System.Runtime.InteropServices;

[assembly:ComVisible(true)]

// Define two classes, and assign one an explicit GUID.
[GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")]
public class ExplicitGuid
{ }

public class NoExplicitGuid
{ }

public class Example
{
   public static void Main()
   {
      Type explicitType = typeof(ExplicitGuid);
      Guid explicitGuid = explicitType.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type explicitCOM = Type.GetTypeFromCLSID(explicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        explicitCOM.Name, explicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        explicitType.Name, explicitCOM.Name,
                        explicitType.Equals(explicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(explicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      } 
        
      Type notExplicit = typeof(NoExplicitGuid);
      Guid notExplicitGuid = notExplicit.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        notExplicitCOM.Name, notExplicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        notExplicit.Name, notExplicitCOM.Name,
                        notExplicit.Equals(notExplicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(notExplicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      }   
   }
}
// The example displays the following output:
//       Created __ComObject type from CLSID d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4
//       ExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {D055CBA3-1F83-4BD7-BA19-E22B1B8EC3C4} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
//       
//       Created __ComObject type from CLSID 74f03346-a718-3516-ac78-f351c7459ffb
//       NoExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {74F03346-A718-3516-AC78-F351C7459FFB} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Вместо этого GetTypeFromCLSID(Guid, String, Boolean) следует использовать только для получения GUID неуправляемого COM-объекта, а результирующий Type объект, передаваемый CreateInstance(Type) в метод, должен представлять неуправляемый COM-объект.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

GetTypeFromCLSID(Guid, String, Boolean)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

Возвращает с указанного сервера тип, связанный с заданным кодом CLSID, позволяющий определить, будет ли выбрасываться исключение при происхождении ошибки во время загрузки типа.

public static Type? GetTypeFromCLSID (Guid clsid, string? server, bool throwOnError);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static Type? GetTypeFromCLSID (Guid clsid, string? server, bool throwOnError);
public static Type GetTypeFromCLSID (Guid clsid, string server, bool throwOnError);

Параметры

clsid
Guid

Код CLSID извлекаемого типа.

server
String

Сервер, с которого должен быть загружен тип. Если в качестве имени сервера задано значение null, этот метод автоматически перейдет к поиску на локальном компьютере.

throwOnError
Boolean

Значение true для вызова любого возникшего исключения.

-или-

Значение false для игнорирования всех происходящих исключений.

Возвращаемое значение

System.__ComObject вне зависимости от того, допустим ли код CLSID.

Атрибуты

Примеры

В следующем примере используется ИДЕНТИФИКАТОР CLSID объекта Приложения Microsoft Word для получения типа COM, представляющего приложение Microsoft Word, с сервера с именем computer17.central.contoso.com. Затем он создает экземпляр типа, вызывая Activator.CreateInstance метод , и закрывает его, вызывая метод Application.Quit . Исключение возникает, если при загрузке типа возникает ошибка.

using System;
using System.Reflection;
using System.Runtime.InteropServices;

public class Example
{
   private const string WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}";
   
   public static void Main()
   {
      try {
         // Start an instance of the Word application.
         var word = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID), 
                                          "computer17.central.contoso.com",
                                          true);
         Console.WriteLine("Instantiated Type object from CLSID {0}",
                           WORD_CLSID);
         Object wordObj = Activator.CreateInstance(word);
         Console.WriteLine("Instantiated {0}", 
                           wordObj.GetType().FullName, WORD_CLSID);
            
         // Close Word.
         word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, 
                           wordObj, new object[] { 0, 0, false } );
      }
      // The method can throw any of a variety of exceptions.
      catch (Exception e) {
         Console.WriteLine("{0}: Unable to instantiate an object for {1}", 
                           e.GetType().Name, WORD_CLSID);
      }      
   }
}
// The example displays the following output:
//    Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
//    Instantiated Microsoft.Office.Interop.Word.ApplicationClass

Комментарии

Метод GetTypeFromCLSID поддерживает доступ с поздней привязкой к неуправляемым COM-объектам из платформа .NET Framework приложений, если вы знаете идентификатор класса (CLSID) com-объекта. Идентификатор класса для COM-классов определен в HKEY_CLASSES_ROOT\CLSID разделе реестра. Вы можете получить значение свойства , IsCOMObject чтобы определить, является ли тип, возвращаемый этим методом, COM-объектом.

Совет

Метод можно вызвать GetTypeFromProgID для доступа с поздней привязкой к COM-объектам, программный идентификатор которых (ProgID) вы знаете.

Создание экземпляра неуправляемого COM-объекта из clSID состоит из двух этапов:

  1. Type Получите объект , представляющий __ComObject объект , соответствующий идентификатору CLSID, вызвав GetTypeFromCLSID метод .

  2. Activator.CreateInstance(Type) Вызовите метод для создания экземпляра COM-объекта.

При указании truethrowOnErrorдля будут возникать исключения, такие как OutOfMemoryException , но для незарегистрированных идентификаторов CLSID это не приведет к сбою.

Примечания для тех, кто вызывает этот метод

Этот метод предназначен для использования при работе с COM-объектами, а не с платформа .NET Framework объектами. Все управляемые объекты, в том числе видимые для COM (то есть их ComVisibleAttribute атрибут — true), имеют GUID, возвращаемый свойством GUID . GetTypeFromCLSID(Guid, String, Boolean) Хотя метод возвращает объект, соответствующий Type GUID для определенного управляемого объекта, этот объект нельзя использовать Type для создания экземпляра CreateInstance(Type) типа путем вызова метода , как показано в следующем примере.

using System;
using System.Runtime.InteropServices;

[assembly:ComVisible(true)]

// Define two classes, and assign one an explicit GUID.
[GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")]
public class ExplicitGuid
{ }

public class NoExplicitGuid
{ }

public class Example
{
   public static void Main()
   {
      Type explicitType = typeof(ExplicitGuid);
      Guid explicitGuid = explicitType.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type explicitCOM = Type.GetTypeFromCLSID(explicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        explicitCOM.Name, explicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        explicitType.Name, explicitCOM.Name,
                        explicitType.Equals(explicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(explicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      } 
        
      Type notExplicit = typeof(NoExplicitGuid);
      Guid notExplicitGuid = notExplicit.GUID;
      
      // Get type of ExplicitGuid from its GUID.
      Type notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid);
      Console.WriteLine("Created {0} type from CLSID {1}",
                        notExplicitCOM.Name, notExplicitGuid);
                        
      // Compare the two type objects.
      Console.WriteLine("{0} and {1} equal: {2}",
                        notExplicit.Name, notExplicitCOM.Name,
                        notExplicit.Equals(notExplicitCOM));                  
      
      // Instantiate an ExplicitGuid object.
      try {
         Object obj = Activator.CreateInstance(notExplicitCOM);
         Console.WriteLine("Instantiated a {0} object", obj.GetType().Name);
      } 
      catch (COMException e) {
         Console.WriteLine("COM Exception:\n{0}\n", e.Message);   
      }   
   }
}
// The example displays the following output:
//       Created __ComObject type from CLSID d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4
//       ExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {D055CBA3-1F83-4BD7-BA19-E22B1B8EC3C4} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
//       
//       Created __ComObject type from CLSID 74f03346-a718-3516-ac78-f351c7459ffb
//       NoExplicitGuid and __ComObject equal: False
//       COM Exception:
//       Retrieving the COM class factory for component with CLSID 
//       {74F03346-A718-3516-AC78-F351C7459FFB} failed due to the following error: 
//       80040154 Class not registered 
//       (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Вместо этого GetTypeFromCLSID(Guid, String, Boolean) следует использовать только для получения GUID неуправляемого COM-объекта, а результирующий Type объект, передаваемый CreateInstance(Type) в метод, должен представлять неуправляемый COM-объект.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1