1

IXamlType接口定义如下:

[Guid(0x7920eab1, 0xa2e5, 0x479a, 0xbd, 80, 0x6c, 0xef, 60, 11, 0x49, 0x70), Version(0x6020000), WebHostHidden]
public interface IXamlType
{
    // Methods
    object ActivateInstance();
    void AddToMap([In] object instance, [In] object key, [In] object value);
    void AddToVector([In] object instance, [In] object value);
    object CreateFromString([In] string value);
    IXamlMember GetMember([In] string name);
    void RunInitializer();

    // Properties
    IXamlType BaseType { get; }
    IXamlMember ContentProperty { get; }
    string FullName { get; }
    bool IsArray { get; }
    bool IsBindable { get; }
    bool IsCollection { get; }
    bool IsConstructible { get; }
    bool IsDictionary { get; }
    bool IsMarkupExtension { get; }
    IXamlType ItemType { get; }
    IXamlType KeyType { get; }
    TypeName UnderlyingType { get; }
}

编译 Metro 应用程序时,会生成一个XamlTypeInfo.g.cs,其中包含此接口的实现,如下所示:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks", "4.0.0.0")]    
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
internal class XamlSystemBaseType : IXamlType
{
    string _fullName;
    Type _underlyingType;

    public XamlSystemBaseType(string fullName, Type underlyingType)
    {
        _fullName = fullName;
        _underlyingType = underlyingType;
    }

    public string FullName { get { return _fullName; } }

    public Type UnderlyingType
    {
        get
        {
            return _underlyingType;
        }
    }

    virtual public IXamlType BaseType { get { throw new NotImplementedException(); } }
    virtual public IXamlMember ContentProperty { get { throw new NotImplementedException(); } }
    virtual public IXamlMember GetMember(string name) { throw new NotImplementedException(); }
    virtual public bool IsArray { get { throw new NotImplementedException(); } }
    virtual public bool IsCollection { get { throw new NotImplementedException(); } }
    virtual public bool IsConstructible { get { throw new NotImplementedException(); } }
    virtual public bool IsDictionary { get { throw new NotImplementedException(); } }
    virtual public bool IsMarkupExtension { get { throw new NotImplementedException(); } }
    virtual public bool IsBindable { get { throw new NotImplementedException(); } }
    virtual public IXamlType ItemType { get { throw new NotImplementedException(); } }
    virtual public IXamlType KeyType { get { throw new NotImplementedException(); } }
    virtual public object ActivateInstance() { throw new NotImplementedException(); }
    virtual public void AddToMap(object instance, object key, object item)  { throw new NotImplementedException(); }
    virtual public void AddToVector(object instance, object item)  { throw new NotImplementedException(); }
    virtual public void RunInitializer()   { throw new NotImplementedException(); }
    virtual public object CreateFromString(String input)   { throw new NotImplementedException(); }
}

奇怪的是,一些接口实现并不一致。如果您尝试在独立的 VS 项目中编译此实现,则会按预期给出以下错误:

错误 CS0738:“ConsoleApplication28.XamlSystemBaseType”未实现接口成员“ConsoleApplication28.IXamlType.UnderlyingType”。“ConsoleApplication28.XamlSystemBaseType.UnderlyingType”无法实现“ConsoleApplication28.IXamlType.UnderlyingType”,因为它没有“ConsoleApplication28.TypeName”的匹配返回类型。


我的问题是 .g.cs 是如何编译的——我通过在 Reflector 中打开编译的程序集来确认——它还显示了相同的实现,其中某些属性/方法的签名类型不匹配。

更新:

为了确认我所看到的,我使用了 Reflector 并看到了以下内容:

IXamlType.UnderlyingType(来自程序集 Windows,Version=255.255.255.255)定义为:

TypeName UnderlyingType { get; }

在任何 Metro 应用程序中找到的 XamlSystemBaseType 将 UnderlyingType 定义为:

   public Type UnderlyingType { get; }

鉴于上述情况,我不明白它是如何工作的!

更新#2

好的 - 当您在 Reflector 中打开 Windows.winmd 文件时,您会看到:

TypeName UnderlyingType { get; }

但是,如果您在 Visual Studio 中执行以下操作:

将光标放在以下行的IXamlType上:

内部类 XamlSystemBaseType:IXamlType

然后按F12,打开的自动生成的定义文件有:

    public Type UnderlyingType { get; }

所以在我不知道的场景下肯定发生了一些事情!

什么(如果??)某些类型自动映射到其他类型的文档以及与此相对应的规则/属性将有很大帮助!

4

2 回答 2

0

您的问题似乎是您找到的接口定义将 UnderlyingType 属性声明为

TypeName UnderlyingType { get; }

虽然生成的基本实现将其定义为:

public Type UnderlyingType ...

好吧,我在 VS 中打开 XamlTypeInfo.g.cs 并导航到 IXamlType 接口的定义,它实际上将其定义为

Type UnderlyingType { get; }

似乎您找到的接口定义无效。查看UnderlyingType属性的文档,它说该属性的类型是 C# 中的 Type,但 C++ 中的 TypeName - 这可能是您的差异的来源。

更大的问题是 - 你为什么要尝试在控制台应用程序中编译它?控制台应用程序不使用 WinRT。

于 2012-05-17T16:03:45.677 回答
0

似乎这是因为所谓的“投影类型”而发生的,但是我无法找到任何正式的文档。我在这里开始了另一个问题:

WinRT 投影类型文档

于 2012-05-21T09:12:20.947 回答