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 で開いて確認しました。また、一部のプロパティ/メソッドのシグネチャ タイプが一致しない同じ実装も示されました。

アップデート:

私が見たものを確認するために、リフレクターを使用し、次のことを確認しました。

IXamlType.UnderlyingType (アセンブリ Windows から、バージョン = 255.255.255.255) は次のように定義されます。

TypeName UnderlyingType { get; }

どの Metro アプリにもある XamlSystemBaseType は、UnderlyingType を次のように定義します。

   public Type UnderlyingType { get; }

上記を考えると、私はそれがどのように機能するのか理解していません!

アップデート #2

OK - Reflector で Windows.winmd ファイルを開くと、次のように表示されます。

TypeName UnderlyingType { get; }

ただし、Visual Studio で行う場合:

次の行のIXamlTypeにカーソルを置きます。

内部クラス XamlSystemBaseType : IXamlType

次にF12 を押すと、自動生成された定義ファイルが開きます。

    public Type UnderlyingType { get; }

だから、私が気づいていないシーンで何かが起こっていることは間違いありません!

一部のタイプが他のタイプに自動マッピングされるもの (if??) のドキュメントと、これに対応するルール/属性は非常に役立ちます!

4

2 に答える 2

0

これは「投影型」と呼ばれるものが原因のようですが、これに関する正式なドキュメントは見つかりませんでした。私はここでこれについて別の質問を始めました:

WinRT投影型のドキュメント

于 2012-05-21T09:12:20.947 に答える
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 に答える