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

时间:2011-01-27 10:18:07

标签: c# .net marshalling com-interop

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

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

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

2 个答案:

答案 0 :(得分:6)

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

... GenerateGuidForType提供与Type.GUID属性相同的功能。

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

E.g:


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.
        }
    }
}

答案 1 :(得分:2)

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