Type.GetTypeFromCLSID 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取与指定类标识符(CLSID)关联的类型。
重载
| 名称 | 说明 |
|---|---|
| GetTypeFromCLSID(Guid) |
获取与指定类标识符(CLSID)关联的类型。 |
| GetTypeFromCLSID(Guid, Boolean) |
获取与指定类标识符(CLSID)关联的类型,指定在加载类型时发生错误时是否引发异常。 |
| GetTypeFromCLSID(Guid, String) |
从指定服务器获取与指定类标识符 (CLSID) 关联的类型。 |
| GetTypeFromCLSID(Guid, String, Boolean) |
从指定服务器获取与指定类标识符(CLSID)关联的类型,指定在加载类型时发生错误时是否引发异常。 |
GetTypeFromCLSID(Guid)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- 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);
public static Type GetTypeFromCLSID(Guid clsid);
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member GetTypeFromCLSID : Guid -> Type
static member GetTypeFromCLSID : Guid -> Type
Public Shared Function GetTypeFromCLSID (clsid As Guid) As Type
参数
- clsid
- Guid
要获取的类型 CLSID。
返回
System.__ComObject 无论 CLSID 是否有效。
- 属性
示例
以下示例使用 Microsoft Word Application 对象的 CLSID 检索表示 Microsoft Word 应用程序的 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));
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
open System
open System.Reflection
let [<Literal>] WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}"
// Start an instance of the Word application.
let word = Type.GetTypeFromCLSID(Guid.Parse WORD_CLSID)
printfn $"Instantiated Type object from CLSID {WORD_CLSID}"
let wordObj = Activator.CreateInstance word
printfn $"Instantiated {wordObj.GetType().FullName}"
// Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, wordObj, [| box 0; 0; false |]) |> ignore
// The example displays the following output:
// Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
// Instantiated Microsoft.Office.Interop.Word.ApplicationClass
Imports System.Reflection
Imports System.Runtime.InteropServices
Module Example
Private Const WORD_CLSID As String = "{000209FF-0000-0000-C000-000000000046}"
Public Sub Main()
' Start an instance of the Word application.
Dim word As Type = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID))
Console.WriteLine("Instantiated Type object from CLSID {0}",
WORD_CLSID)
Dim wordObj As Object = Activator.CreateInstance(word)
Console.WriteLine("Instantiated {0}",
wordObj.GetType().FullName)
' Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, Nothing,
wordObj, New Object() { 0, 0, False } )
End Sub
End Module
' The example displays the following output:
' Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
' Instantiated Microsoft.Office.Interop.Word.ApplicationClass
注解
当你知道 COM 对象的类标识符(CLSID)时,该方法 GetTypeFromCLSID 支持从 .NET Framework 应用中后期绑定访问非托管 COM 对象。 COM 类的类标识符在注册表的 HKEY_CLASSES_ROOT\CLSID 键中定义。 可以检索属性的值 IsCOMObject ,以确定此方法返回的类型是否为 COM 对象。
小窍门
可以调用 GetTypeFromProgID 此方法,以便对已知编程标识符(ProgID)的 COM 对象进行后期绑定访问。
从 CLSID 实例化非托管 COM 对象的过程分为两步:
获取一个 Type 对象,该对象表示
__ComObject通过调用 GetTypeFromCLSID 该方法与 CLSID 对应的对象。Activator.CreateInstance(Type)调用该方法以实例化 COM 对象。
有关插图的示例,请参阅示例。
重GetTypeFromCLSID(Guid)载会忽略基于clsid参数实例化Type对象时可能发生的任何异常。 请注意,如果未 clsid 在注册表中找到异常,则不会引发异常。
调用方说明
此方法适用于处理 COM 对象而不是 .NET Framework 对象时使用。 所有托管对象(包括 COM 可见的对象(即其 ComVisibleAttribute 属性是 true)都有属性返回的 GUID GUID。 尽管该方法返回与 Type .NET Framework 对象的 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)).
open System
open System.Runtime.InteropServices
[<assembly: ComVisible true>]
do ()
// Define two classes, and assign one an explicit GUID.
[<Guid "d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4">]
type ExplicitGuid() = class end
type NoExplicitGuid() = class end
let explicitType = typeof<ExplicitGuid>
let explicitGuid = explicitType.GUID
// Get type of ExplicitGuid from its GUID.
let explicitCOM = Type.GetTypeFromCLSID explicitGuid
printfn $"Created {explicitCOM.Name} type from CLSID {explicitGuid}"
// Compare the two type objects.
printfn $"{explicitType.Name} and {explicitCOM.Name} equal: {explicitType.Equals explicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance explicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
let notExplicit = typeof<NoExplicitGuid>
let notExplicitGuid = notExplicit.GUID
// Get type of ExplicitGuid from its GUID.
let notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid)
printfn $"Created {notExplicitCOM.Name} type from CLSID {notExplicitGuid}"
// Compare the two type objects.
printfn $"{notExplicit.Name} and {notExplicitCOM.Name} equal: {notExplicit.Equals notExplicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance notExplicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
// 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)).
Imports System.Runtime.InteropServices
<Assembly:ComVisible(True)>
' Define two classes, and assign one an explicit GUID.
<GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")>
Public Class ExplicitGuid
End Class
Public Class NoExplicitGuid
End Class
Module Example
Public Sub Main()
Dim explicitType As Type = GetType(ExplicitGuid)
Dim explicitGuid As Guid = explicitType.GUID
' Get type of ExplicitGuid from its GUID.
Dim explicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(explicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
Dim notExplicit As Type = GetType(NoExplicitGuid)
Dim notExplicitGuid As Guid = notExplicit.GUID
' Get type of ExplicitGuid from its GUID.
Dim notExplicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(notExplicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
End Sub
End Module
' 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)应仅用于检索非托管 COM 对象的 GUID,而传递给CreateInstance(Type)该方法的结果Type对象必须表示非托管 COM 对象。
适用于
GetTypeFromCLSID(Guid, Boolean)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- 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);
public static Type GetTypeFromCLSID(Guid clsid, bool throwOnError);
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member GetTypeFromCLSID : Guid * bool -> Type
static member GetTypeFromCLSID : Guid * bool -> Type
Public Shared Function GetTypeFromCLSID (clsid As Guid, throwOnError As Boolean) As Type
参数
- clsid
- Guid
要获取的类型 CLSID。
返回
System.__ComObject 无论 CLSID 是否有效。
- 属性
示例
以下示例使用 Microsoft Word Application 对象的 CLSID 检索表示 Microsoft Word 应用程序的 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), 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
open System
open System.Reflection
let [<Literal>] WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}"
try
// Start an instance of the Word application.
let word = Type.GetTypeFromCLSID(Guid.Parse WORD_CLSID, true)
printfn $"Instantiated Type object from CLSID {WORD_CLSID}"
let wordObj = Activator.CreateInstance word
printfn $"Instantiated {wordObj.GetType().FullName} from CLSID {WORD_CLSID}"
// Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, wordObj, [| box 0; 0; false |] ) |> ignore
with _ ->
printfn $"Unable to instantiate an object for {WORD_CLSID}"
// The example displays the following output:
// Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
// Instantiated Microsoft.Office.Interop.Word.ApplicationClass
Imports System.Reflection
Imports System.Runtime.InteropServices
Module Example
Private Const WORD_CLSID As String = "{000209FF-0000-0000-C000-000000000046}"
Public Sub Main()
' Start an instance of the Word application.
Try
Dim word As Type = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID), True)
Console.WriteLine("Instantiated Type object from CLSID {0}",
WORD_CLSID)
Dim wordObj As Object = Activator.CreateInstance(word)
Console.WriteLine("Instantiated {0}",
wordObj.GetType().FullName)
' Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, Nothing,
wordObj, New Object() { 0, 0, False } )
' The method can throw any of a number of unexpected exceptions.
Catch e As Exception
Console.WriteLine("Unable to instantiate an object for {0}", WORD_CLSID)
End Try
End Sub
End Module
' The example displays the following output:
' Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
' Instantiated Microsoft.Office.Interop.Word.ApplicationClass
注解
当你知道 COM 对象的类标识符(CLSID)时,该方法 GetTypeFromCLSID 支持从 .NET Framework 应用中后期绑定访问非托管 COM 对象。 COM 类的类标识符在注册表的 HKEY_CLASSES_ROOT\CLSID 键中定义。 可以检索属性的值 IsCOMObject ,以确定此方法返回的类型是否为 COM 对象。
小窍门
可以调用 GetTypeFromProgID 此方法,以便对已知编程标识符(ProgID)的 COM 对象进行后期绑定访问。
从 CLSID 实例化非托管 COM 对象的过程分为两步:
获取一个 Type 对象,该对象表示
__ComObject通过调用 GetTypeFromCLSID 该方法与 CLSID 对应的对象。Activator.CreateInstance(Type)调用该方法以实例化 COM 对象。
有关插图的示例,请参阅示例。
指定时truethrowOnError会引发异常,OutOfMemoryException但未注册的 CLSID 不会失败。
调用方说明
此方法适用于处理 COM 对象而不是 .NET Framework 对象时使用。 所有托管对象(包括 COM 可见的对象(即其 ComVisibleAttribute 属性是 true)都有属性返回的 GUID GUID。 尽管该方法返回与 Type .NET Framework 对象的 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)).
open System
open System.Runtime.InteropServices
[<assembly: ComVisible true>]
do ()
// Define two classes, and assign one an explicit GUID.
[<Guid "d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4">]
type ExplicitGuid() = class end
type NoExplicitGuid() = class end
let explicitType = typeof<ExplicitGuid>
let explicitGuid = explicitType.GUID
// Get type of ExplicitGuid from its GUID.
let explicitCOM = Type.GetTypeFromCLSID explicitGuid
printfn $"Created {explicitCOM.Name} type from CLSID {explicitGuid}"
// Compare the two type objects.
printfn $"{explicitType.Name} and {explicitCOM.Name} equal: {explicitType.Equals explicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance explicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
let notExplicit = typeof<NoExplicitGuid>
let notExplicitGuid = notExplicit.GUID
// Get type of ExplicitGuid from its GUID.
let notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid)
printfn $"Created {notExplicitCOM.Name} type from CLSID {notExplicitGuid}"
// Compare the two type objects.
printfn $"{notExplicit.Name} and {notExplicitCOM.Name} equal: {notExplicit.Equals notExplicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance notExplicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
// 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)).
Imports System.Runtime.InteropServices
<Assembly:ComVisible(True)>
' Define two classes, and assign one an explicit GUID.
<GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")>
Public Class ExplicitGuid
End Class
Public Class NoExplicitGuid
End Class
Module Example
Public Sub Main()
Dim explicitType As Type = GetType(ExplicitGuid)
Dim explicitGuid As Guid = explicitType.GUID
' Get type of ExplicitGuid from its GUID.
Dim explicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(explicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
Dim notExplicit As Type = GetType(NoExplicitGuid)
Dim notExplicitGuid As Guid = notExplicit.GUID
' Get type of ExplicitGuid from its GUID.
Dim notExplicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(notExplicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
End Sub
End Module
' 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)应仅用于检索非托管 COM 对象的 GUID,而传递给CreateInstance(Type)该方法的结果Type对象必须表示非托管 COM 对象。
适用于
GetTypeFromCLSID(Guid, String)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
从指定服务器获取与指定类标识符 (CLSID) 关联的类型。
public:
static Type ^ GetTypeFromCLSID(Guid clsid, System::String ^ server);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static Type? GetTypeFromCLSID(Guid clsid, string? server);
public static Type? GetTypeFromCLSID(Guid clsid, string? server);
public static Type GetTypeFromCLSID(Guid clsid, string server);
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member GetTypeFromCLSID : Guid * string -> Type
static member GetTypeFromCLSID : Guid * string -> Type
Public Shared Function GetTypeFromCLSID (clsid As Guid, server As String) As Type
参数
- clsid
- Guid
要获取的类型 CLSID。
- server
- String
要从中加载类型的服务器。 如果服务器名称为 null,此方法会自动还原到本地计算机。
返回
System.__ComObject 无论 CLSID 是否有效。
- 属性
示例
以下示例使用 Microsoft Word Application 对象的 CLSID 从名为 computer17.central.contoso.com 的服务器检索表示 Microsoft Word 应用程序的 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
open System
open System.Reflection
open System.Runtime.InteropServices
let [<Literal>] WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}"
// Start an instance of the Word application.
let word = Type.GetTypeFromCLSID(Guid.Parse WORD_CLSID, "computer17.central.contoso.com")
printfn $"Instantiated Type object from CLSID {WORD_CLSID}"
try
let wordObj = Activator.CreateInstance word
printfn $"Instantiated {wordObj.GetType().FullName} from CLSID {WORD_CLSID}"
// Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, wordObj, [| box 0; 0; false |] ) |> ignore
with :? COMException ->
printfn "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
Imports System.Reflection
Imports System.Runtime.InteropServices
Module Example
Private Const WORD_CLSID As String = "{000209FF-0000-0000-C000-000000000046}"
Public Sub Main()
' Start an instance of the Word application.
Dim word As Type = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID), "computer17.central.contoso.com")
Console.WriteLine("Instantiated Type object from CLSID {0}",
WORD_CLSID)
Try
Dim wordObj As Object = Activator.CreateInstance(word)
Console.WriteLine("Instantiated {0}",
wordObj.GetType().FullName)
' Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, Nothing,
wordObj, New Object() { 0, 0, False } )
Catch e As COMException
Console.WriteLine("Unable to instantiate object.")
End Try
End Sub
End Module
' The example displays the following output:
' Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
' Instantiated Microsoft.Office.Interop.Word.ApplicationClass
注解
当你知道 COM 对象的类标识符(CLSID)时,该方法 GetTypeFromCLSID 支持从 .NET Framework 应用中后期绑定访问非托管 COM 对象。 COM 类的类标识符在注册表的 HKEY_CLASSES_ROOT\CLSID 键中定义。 可以检索属性的值 IsCOMObject ,以确定此方法返回的类型是否为 COM 对象。
小窍门
可以调用 GetTypeFromProgID 此方法,以便对已知编程标识符(ProgID)的 COM 对象进行后期绑定访问。
从 CLSID 实例化非托管 COM 对象的过程分为两步:
获取一个 Type 对象,该对象表示
__ComObject通过调用 GetTypeFromCLSID 该方法与 CLSID 对应的对象。Activator.CreateInstance(Type)调用该方法以实例化 COM 对象。
调用方说明
此方法适用于处理 COM 对象而不是 .NET Framework 对象时使用。 所有托管对象(包括 COM 可见的对象(即其 ComVisibleAttribute 属性是 true)都有属性返回的 GUID GUID。 尽管该方法返回与 Type .NET Framework 对象的 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)).
open System
open System.Runtime.InteropServices
[<assembly: ComVisible true>]
do ()
// Define two classes, and assign one an explicit GUID.
[<Guid "d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4">]
type ExplicitGuid() = class end
type NoExplicitGuid() = class end
let explicitType = typeof<ExplicitGuid>
let explicitGuid = explicitType.GUID
// Get type of ExplicitGuid from its GUID.
let explicitCOM = Type.GetTypeFromCLSID explicitGuid
printfn $"Created {explicitCOM.Name} type from CLSID {explicitGuid}"
// Compare the two type objects.
printfn $"{explicitType.Name} and {explicitCOM.Name} equal: {explicitType.Equals explicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance explicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
let notExplicit = typeof<NoExplicitGuid>
let notExplicitGuid = notExplicit.GUID
// Get type of ExplicitGuid from its GUID.
let notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid)
printfn $"Created {notExplicitCOM.Name} type from CLSID {notExplicitGuid}"
// Compare the two type objects.
printfn $"{notExplicit.Name} and {notExplicitCOM.Name} equal: {notExplicit.Equals notExplicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance notExplicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
// 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)).
Imports System.Runtime.InteropServices
<Assembly:ComVisible(True)>
' Define two classes, and assign one an explicit GUID.
<GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")>
Public Class ExplicitGuid
End Class
Public Class NoExplicitGuid
End Class
Module Example
Public Sub Main()
Dim explicitType As Type = GetType(ExplicitGuid)
Dim explicitGuid As Guid = explicitType.GUID
' Get type of ExplicitGuid from its GUID.
Dim explicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(explicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
Dim notExplicit As Type = GetType(NoExplicitGuid)
Dim notExplicitGuid As Guid = notExplicit.GUID
' Get type of ExplicitGuid from its GUID.
Dim notExplicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(notExplicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
End Sub
End Module
' 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)应仅用于检索非托管 COM 对象的 GUID,而传递给CreateInstance(Type)该方法的结果Type对象必须表示非托管 COM 对象。
适用于
GetTypeFromCLSID(Guid, String, Boolean)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
从指定服务器获取与指定类标识符(CLSID)关联的类型,指定在加载类型时发生错误时是否引发异常。
public:
static Type ^ GetTypeFromCLSID(Guid clsid, System::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);
public static Type GetTypeFromCLSID(Guid clsid, string server, bool throwOnError);
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member GetTypeFromCLSID : Guid * string * bool -> Type
static member GetTypeFromCLSID : Guid * string * bool -> Type
Public Shared Function GetTypeFromCLSID (clsid As Guid, server As String, throwOnError As Boolean) As Type
参数
- clsid
- Guid
要获取的类型 CLSID。
- server
- String
要从中加载类型的服务器。 如果服务器名称为 null,此方法会自动还原到本地计算机。
返回
System.__ComObject 无论 CLSID 是否有效。
- 属性
示例
以下示例使用 Microsoft Word Application 对象的 CLSID 从名为 computer17.central.contoso.com 的服务器检索表示 Microsoft Word 应用程序的 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
open System
open System.Reflection
let [<Literal>] WORD_CLSID = "{000209FF-0000-0000-C000-000000000046}"
try
// Start an instance of the Word application.
let word = Type.GetTypeFromCLSID(Guid.Parse WORD_CLSID, "computer17.central.contoso.com", true)
printfn $"Instantiated Type object from CLSID {WORD_CLSID}"
let wordObj = Activator.CreateInstance word
printfn $"Instantiated {wordObj.GetType().FullName} from CLSID {WORD_CLSID}"
// Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, null, wordObj, [| box 0; 0; false |] ) |> ignore
// The method can throw any of a variety of exceptions.
with e ->
printfn $"{e.GetType().Name}: Unable to instantiate an object for {WORD_CLSID}"
// The example displays the following output:
// Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
// Instantiated Microsoft.Office.Interop.Word.ApplicationClass
Imports System.Reflection
Imports System.Runtime.InteropServices
Module Example
Private Const WORD_CLSID As String = "{000209FF-0000-0000-C000-000000000046}"
Public Sub Main()
Try
' Start an instance of the Word application.
Dim word As Type = Type.GetTypeFromCLSID(Guid.Parse(WORD_CLSID),
"computer17.central.contoso.com",
True)
Console.WriteLine("Instantiated Type object from CLSID {0}",
WORD_CLSID)
Dim wordObj As Object = Activator.CreateInstance(word)
Console.WriteLine("Instantiated {0}",
wordObj.GetType().FullName)
' Close Word.
word.InvokeMember("Quit", BindingFlags.InvokeMethod, Nothing,
wordObj, New Object() { 0, 0, False } )
' The method can throw any of a variety of exceptions.
Catch e As Exception
Console.WriteLine("{0}: Unable to instantiate an object for {1}",
e.GetType().Name, WORD_CLSID)
End Try
End Sub
End Module
' The example displays the following output:
' Instantiated Type object from CLSID {000209FF-0000-0000-C000-000000000046}
' Instantiated Microsoft.Office.Interop.Word.ApplicationClass
注解
当你知道 COM 对象的类标识符(CLSID)时,该方法 GetTypeFromCLSID 支持从 .NET Framework 应用中后期绑定访问非托管 COM 对象。 COM 类的类标识符在注册表的 HKEY_CLASSES_ROOT\CLSID 键中定义。 可以检索属性的值 IsCOMObject ,以确定此方法返回的类型是否为 COM 对象。
小窍门
可以调用 GetTypeFromProgID 此方法,以便对已知编程标识符(ProgID)的 COM 对象进行后期绑定访问。
从 CLSID 实例化非托管 COM 对象的过程分为两步:
获取一个 Type 对象,该对象表示
__ComObject通过调用 GetTypeFromCLSID 该方法与 CLSID 对应的对象。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)).
open System
open System.Runtime.InteropServices
[<assembly: ComVisible true>]
do ()
// Define two classes, and assign one an explicit GUID.
[<Guid "d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4">]
type ExplicitGuid() = class end
type NoExplicitGuid() = class end
let explicitType = typeof<ExplicitGuid>
let explicitGuid = explicitType.GUID
// Get type of ExplicitGuid from its GUID.
let explicitCOM = Type.GetTypeFromCLSID explicitGuid
printfn $"Created {explicitCOM.Name} type from CLSID {explicitGuid}"
// Compare the two type objects.
printfn $"{explicitType.Name} and {explicitCOM.Name} equal: {explicitType.Equals explicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance explicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
let notExplicit = typeof<NoExplicitGuid>
let notExplicitGuid = notExplicit.GUID
// Get type of ExplicitGuid from its GUID.
let notExplicitCOM = Type.GetTypeFromCLSID(notExplicitGuid)
printfn $"Created {notExplicitCOM.Name} type from CLSID {notExplicitGuid}"
// Compare the two type objects.
printfn $"{notExplicit.Name} and {notExplicitCOM.Name} equal: {notExplicit.Equals notExplicitCOM}"
// Instantiate an ExplicitGuid object.
try
let obj = Activator.CreateInstance notExplicitCOM
printfn $"Instantiated a {obj.GetType().Name} object"
with :? COMException as e ->
printfn $"COM Exception:\n{e.Message}\n"
// 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)).
Imports System.Runtime.InteropServices
<Assembly:ComVisible(True)>
' Define two classes, and assign one an explicit GUID.
<GuidAttribute("d055cba3-1f83-4bd7-ba19-e22b1b8ec3c4")>
Public Class ExplicitGuid
End Class
Public Class NoExplicitGuid
End Class
Module Example
Public Sub Main()
Dim explicitType As Type = GetType(ExplicitGuid)
Dim explicitGuid As Guid = explicitType.GUID
' Get type of ExplicitGuid from its GUID.
Dim explicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(explicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
Dim notExplicit As Type = GetType(NoExplicitGuid)
Dim notExplicitGuid As Guid = notExplicit.GUID
' Get type of ExplicitGuid from its GUID.
Dim notExplicitCOM As Type = 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
Dim obj As Object = Activator.CreateInstance(notExplicitCOM)
Console.WriteLine("Instantiated a {0} object", obj.GetType().Name)
Catch e As COMException
Console.WriteLine("COM Exception:{1}{0}{1}", e.Message, vbCrLf)
End Try
End Sub
End Module
' 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)应仅用于检索非托管 COM 对象的 GUID,而传递给CreateInstance(Type)该方法的结果Type对象必须表示非托管 COM 对象。