0

作为一个例子(以及我提出问题的原因),据我从 ILDASM 显示的 WinMD 信息中可以看出,类 Windows.XAML.Media.Transform 没有定义的构造函数。

但是,如果我尝试从该类派生,在我的 C# 项目中,编译器会抱怨找不到非构造函数。

在我看来,这可能是构造函数隐藏可见性的结果。

在C#中声明私有(或内部)构造函数也可以达到同样的效果,但必须声明,否则编译器会创建公有构造函数,而该类确实是可派生的。

有什么提示吗?

4

2 回答 2

3

我认为这里发生的事情是,该类已明确声明了一个内部(默认)构造函数,没有公共构造函数,因此开发人员可以从定义程序集中的类继承。程序集之外的其他所有人都无法从该类继承。

于 2012-08-29T16:03:31.457 回答
0

WinRT 是 COM 概念的演变,是一个完全不同的故事,因为我们谈论的是二进制组件而不是源继承。这个 ABI 故事中最重要的一点是,组件中唯一可以使用的就是那些通过接口公开的东西。构造函数不能在接口中定义,静态也不能,这意味着 WinRT 也需要这些接口。

WinRT 组件的 C# 视图是语言投影的产物,而不是组件的真实布局。要完全了解其中的内容,您应该查看 C++ 中的组件,使用本机库 WRL,该库是用于构建 WinRT API 的库。

Constructor 是 WinRT 组件的工厂接口的投影(和静态,WinRT 新,因为它们在 COM 中不存在,有类似的处理)。

当您从 C# 中“新建”一个对象时,首先会创建一个与该组件关联的 Factory 组件。在此之后,工厂创建对象。出于这个原因,构造函数问题应该从工厂组件的角度来看,而不是从构造函数的角度来看(存在于底层实现中,但并不重要,因为你看到的组件只是它的二进制合约,ABI) .

因此有不同的选择: 1. 工厂不存在,您无法创建组件。如果 Factory 接口是内部的,则您不能使用它,也不能创建对象。2. 存在工厂并暴露默认构造函数。在 C# 中,您可以新建对象 3. 存在自定义工厂并公开自定义构造函数(whit 参数)。

ITransformFactory 是私有的,我相信这可以解释您所看到的行为。

关于这个主题还有更多内容,因为 WinRT 聚合是它们提供二进制继承和版本控制的方式,但这是另一个(非常长的)故事。

仍在挖掘,永远不会停止,这是我们工作中有趣的部分 :)

于 2012-08-30T12:09:56.133 回答