0

As an example (and the reason of my question), the class Windows.XAML.Media.Transform, as far as I can see from the WinMD info shown by ILDASM, has no defined constructor.

But if I try to derive from that class, on my C# project, compiler complains that non constructor can be found.

This seems to me that this could be a result of hidden visibility of the constructor.

A same effect can be achieved in C# declaring a private (or internal) Constructor, but it must be declared, otherwise a public constructor is created by the compiler, and the class is indeed derivable.

Any hint?

4

2 に答える 2

3

ここで何が起こっているかというと、クラスが内部 (デフォルト) コンストラクターを明示的に宣言し、パブリック コンストラクターは宣言していないため、開発者は定義アセンブリ内のクラスから継承できます。アセンブリの外にいる他のすべての人は、クラスから継承することができません。

于 2012-08-29T16:03:31.457 に答える
0

WinRT は COM 概念の進化形であり、ソース継承ではなくバイナリ コンポーネントについて話しているため、まったく別の話です。この ABI の話で最も重要なことは、コンポーネントで使用できるのは、インターフェイスを介して公開されているものだけだということです。コンストラクターはインターフェイスで定義することも、静的にすることもできません。つまり、WinRT にはこれらのインターフェイスも必要です。

WinRT コンポーネントの C# ビューは、言語プロジェクションの成果物であり、コンポーネントの実際のレイアウトではありません。その内容を完全に理解するには、WinRT API のビルドに使用されるライブラリであるネイティブ ライブラリ WRL を使用して、C++ でコンポーネントを確認する必要があります。

コンストラクターは、WinRT コンポーネントのファクトリ インターフェイスのプロジェクションです (また、COM には存在しなかったので WinRT に新しく追加された statics も同様の処理を行います)。

C# からオブジェクトを「新規作成」すると、コンポーネントに関連付けられた Factory コンポーネントが最初に作成されます。この後、ファクトリはオブジェクトを作成します。このため、コンストラクターの質問は、コンストラクターの観点からではなく、ファクトリ コンポーネントの観点から見る必要があります (基本的な実装に存在しますが、コンポーネントについて表示されるのはそのバイナリ コントラクトである ABI のみであるため、実際には問題ではありません)。 .

したがって、さまざまなオプションがあります。 1. ファクトリが存在せず、コンポーネントを作成できません。Factory インターフェイスが内部の場合、それを使用できず、オブジェクトを作成できません。2. ファクトリーが存在し、デフォルトのコンストラクターを公開します。C# では、オブジェクト 3 を新規作成できます。カスタム ファクトリが存在し、カスタム コンストラクター (Whit パラメーター) を公開します。

ITransformFactory はプライベートであり、これがあなたが見た動作を説明していると思います。

WinRT アグリゲーションはバイナリの継承とバージョン管理を提供する方法であるため、このトピックにはさらに多くのことがありますが、これは別の (非常に長い) 話です。

掘り続け、止まることはありません。それが私たちの仕事の楽しい部分です :)

于 2012-08-30T12:09:56.133 に答える