0

在探索 WinRT 时,我对单例进行了实验:通过自己实现 IActivationFactory,我可以“在 ABI 级别”制作单例。工厂每次只返回相同的实例。通过扩展,我的类型对 RoActivateInstance 的任何调用都将返回相同的指针。

奇怪的是,与 .NET 互操作时几乎是透明的:

var obj1 = new MySingleton();
var obj2 = new MySingleton();

// At the .NET type level, not the same: ReferenceEquals(obj1, obj2) == false
// At the COM level, the same: Marshal.GetIUnknownForObject(obj1) == Marshal.GetIUnknownForObject(obj2) 

我对此的解释是,每次实例化都会为 WinRT 对象生成一个新的 RCW。因此,它与单例并不完全相同,但可能足够接近。

我还没有检查过其他语言的预测。

我的意图是将它用于不可变对象,它们甚至可能没有任何构造函数参数。(如果他们这样做,激活工厂将需要保留实例映射。)好处主要是减少了内存占用。

但是我在这里踩危险水域吗?我在 COM/ATL 中看到过类似的结构,但在 WinRT 中呢?

4

0 回答 0