Marshal.GenerateGuidForType(Type)和Type.GUID之间有什么区别?

Type classType = typeof(SomeClass); bool equal = Marshal.GenerateGuidForType(classType) == classType.GUID; 

我没有找到一个失败的情况。

那么为什么以及何时应该使用Marshal方法而不是简单地获取GUID属性?

请参阅http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.generateguidfortype.aspx

… GenerateGuidForType提供与Type.GUID属性相同的function。

所以根据文档他们是一样的。 但是,Marshal.GenerateGuidForType仅适用于RuntimeType对象,而Type.GUID也适用于其他一些Type实现。

例如:

using System; using System.CodeDom; using System.Runtime.InteropServices; using System.Workflow.ComponentModel.Compiler; namespace Samples { class Program { static CodeCompileUnit BuildHelloWorldGraph() { var compileUnit = new CodeCompileUnit(); var samples = new CodeNamespace("Samples"); compileUnit.Namespaces.Add(samples); var class1 = new CodeTypeDeclaration("Class1"); samples.Types.Add(class1); return compileUnit; } static void Main(string[] args) { var unit = BuildHelloWorldGraph(); var typeProvider = new TypeProvider(null); typeProvider.AddCodeCompileUnit(unit); var t = typeProvider.GetType("Samples.Class1"); Console.WriteLine(t.GUID); // prints GUID for design time type instance. Console.WriteLine(Marshal.GenerateGuidForType(t)); // throws ArgumentException. } } }
using System; using System.CodeDom; using System.Runtime.InteropServices; using System.Workflow.ComponentModel.Compiler; namespace Samples { class Program { static CodeCompileUnit BuildHelloWorldGraph() { var compileUnit = new CodeCompileUnit(); var samples = new CodeNamespace("Samples"); compileUnit.Namespaces.Add(samples); var class1 = new CodeTypeDeclaration("Class1"); samples.Types.Add(class1); return compileUnit; } static void Main(string[] args) { var unit = BuildHelloWorldGraph(); var typeProvider = new TypeProvider(null); typeProvider.AddCodeCompileUnit(unit); var t = typeProvider.GetType("Samples.Class1"); Console.WriteLine(t.GUID); // prints GUID for design time type instance. Console.WriteLine(Marshal.GenerateGuidForType(t)); // throws ArgumentException. } } } 

根据MSDN , “GenerateGuidForType提供与Type.GUID属性相同的function” 。 使用最适合你的那种应该是安全的。