2

我正在尝试充分了解 Windows 运行时,以便就我的雇主将我们现有的应用程序移植到它需要什么提出建议。我无法找到提供 API 工作原理技术概述的文档。

我所有的网络搜索似乎都将我引向了MSDN 上的 API 参考,它简洁到难以阅读的程度。它记录了 API 类和方法的正式签名,但似乎假设读者已经知道事物是如何组合在一起的。每个方法的目的通常只是描述为一个简洁的句子片段,用空格而不是 CamelCase 重述其名称,并且几乎完全没有关于类型声明中明显的限制、期望和不变量的进一步解释。(这与普通 Win32 API 参考文档中相当丰富的“备注”部分形成对比)。

显然,我不应该使用本文档来初步了解 API 的工作原理。我应该使用什么?

在 MSDN 中向上移动一个级别,有一个名为Concepts and Architecture的部分,以及一些听起来更有前途的编程概念基础知识——但它们实际描述的是看似随机选择的相当专业的主题,当然不是我需要理解 API 参考。

是否有我需要购买和阅读的书本形式的官方文档?MSDN 之外的东西?我找不到的秘密 MSDN 链接?

我已经看到了这个没有得到任何真正答案的上一个问题,也许是因为它的措辞相当不透明,比如“本体”之类的 5 美元。为了更好地解释我在寻找什么,这里有一些问题示例,我希望我寻求的文档能告诉我以下问题的答案:

(请注意,这些只是示例。我的主要目标是找到一个能够回答这些和类似问题的规范,而不是获得这些特定示例的答案。)

Windows.Networking.Sockets.StreamSocket有一个InputStreamtype 的属性,Windows.Storage.Streams.IInputStream我显然应该用它来从套接字读取。但唯一的方法IInputStreamReadAsync读入IBuffer, 并且IBuffer是一个只声明容量和大小属性的接口。如何获取正在读取的实际字节?如果我IBuffer自己实现,系统将如何将它们交付给我?

经过数小时的沮丧点击和谷歌搜索,我初步得出结论,该接口是一个谎言——IBuffer不是任何人都可以实现的,而是ReadAsync特别想要一个Windows.Storage.Streams.Buffer(没有I),不管它的类型声明说什么。然后看来我可以用来DataReaderBuffer. 真的是这样吗?

或者

嗯,它看起来DataReader有一个带 的构造函数IInputStream,所以也许我可以Buffer删掉中间人。但是,这似乎是错误的,因为DataReader诸如 的方法ReadBytes同步的,并且据说 WinRT 中的所有 I/O 都是异步的;当然,声明的方法之一IInputStream是。那么这是如何工作的呢?

在更沮丧的谷歌搜索和点击之后:哦,有一种LoadAsync方法DataReader可以做到……某事。根据 MSDN,它“从输入流中加载数据”,但使用它的约定是什么?我应该在构造之后立即调用它一次DataReader,还是我可以多次调用它以DataReader在下一次读取操作中重用它?内部是否DataReader包含循环缓冲区?如果我尝试读取的字节数比已经异步读取的多,会发生什么?这些方法的超简洁文档ReadFoo没有提到异常或错误条件;DataReader或的类文档也没有IDataReader

或者

显然,应用程序可以是多线程的,因为受支持的 Win32 API包括类似的东西InterlockedCompareExchangeEnterCriticalSection等等。但是似乎既不支持CreateThread也不支持 RTL ,而且在 WinRT 类层次结构中的任何地方似乎都没有任何 Java-ish 类。如何开始一个新线程?_beginthreadexThread

或者

谈到异步 I/O ...我对异步 I/O 和完成延续的一般概念很满意,但是 WinRT 中的精确规则是什么,比如调用完成例程的线程是什么?如果它始终是我开始 I/O 操作的同一个线程(我希望!),我是否需要确保它不时进入某种警报等待,以便系统有机会在那里调用我的代码?

或者

维基百科声称“WinRT 本质上是一个基于 COM 的 API,尽管依赖于增强的 COM。” 这种“增强”究竟是什么?如果我遵循 COM 规则和约定,我是否会因为“增强”而面临被不同工作方式所困扰的风险?或者,相反,由于增强,我可以做一些更容易的事情吗?

或者

对异步回调如何工作的唯一描述使它看起来非常特定于实现语言——它在 C#/CLR、JavaScript 和 C++/CX 之间看起来完全不同。这里的 COM/ABI 级别实际发生了什么?特别是,由于 API 文档似乎假定“C++”表示“C++/CX”,如果我改用 WRL,异步 I/O 将如何工作?或者仅仅是awaitandthen业务只是语言提供的糖,而真正的ABI 总是按照AsyncOperationWithProgressCompletedHandlerAPI 参考中描述的等等?但这是一个委托类型;就COM而言,这甚至具有明确定义的含义吗?

4

2 回答 2

2

我刚刚注意到 MSDN 上似乎有两个并行的页面层次结构描述了 WinRT API:

这是我在问题中咆哮的几乎空洞的文档。但是,一些 API 元素也在

它稍微接近 COM 金属,并且偶尔包含有用的备注部分。例如,它的 IBuffer 页面显示IBuffer的实现还必须实现IBufferByteAccess,它提供对实际字节的访问。

这并不理想(而且似乎仍然隐含了很多信息),但它至少是一些东西。

于 2012-11-05T20:52:04.090 回答
0

我认为这篇文章可能是一个https://chat.stackoverflow.com/辩论,但不是问题。WinRT Api 和投影(c#/xaml 或 html/js 等)参考是在他们的第一个版本中,从我的角度来看,它们只是一个基本参考,而不是一个扩展的文档源。

这通常发生在所有最近创建的技术中,我认为您只需要等待几个月,文档就会开始逐渐改进。

于 2012-11-06T13:20:38.800 回答