- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
WinMD 是一个二进制元数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有内容。
来自 Windows Runtime design :
The Windows Runtime is exposed using API metadata (.winmd files). This is the same format used by the .NET framework (Ecma-335). The underlying binary contract makes it easy for you to access the Windows Runtime APIs directly in the development language of your choice.
Each .winmd file exposes one or more namespaces. These namespaces are grouped by the functionality that they provide. A namespace contains types such as classes, structures, and enumerations.
| COM | WinRT |
|----------------------------|--------------------------------|
| CoInitialize | RoInitialize |
| CoCreateInstance(ProgID)¹ | RoActivateInstance(ClassName) |
| *.tlb | *.winmd |
| compiled from idl | compiled from idl |
| HKCR\Classes\[ProgID] | HKLM\Software\Microsoft\WindowsRuntime\ActivatableClassId\[ClassName] |
| Code stored in native dll | Code stored in native dll |
| DllGetClassObject | DllGetClassObject |
| Is native code | Is native code |
| IUnknown | IUnknown (and IInspectible) |
| stdcall calling convention | stdcall calling convention |
| Everything returns HRESULT | Everything returns HRESULT |
| LoadTypeLib(*.tlb) | ???(*.winmd) |
从 COM tlb 读取元数据
stdole.tlb
),您可以使用各种 Windows 函数来解析 tlb 以从中获取信息。
ITypeLib
界面:
ITypeLib tlb = LoadTypeLib("c:\Windows\system32\stdole2.tlb");
然后你可以开始迭代
中的所有内容。类型库
for (int i = 0 to tlb.GetTypeInfoCount-1)
{
ITypeInfo typeInfo = tlb.GetTypeInfo(i);
TYPEATTR typeAttr = typeInfo.GetTypeAttr();
case typeAttr.typeKind of
TKIND_ENUM: LoadEnum(typeINfo, typeAttr);
TKIND_DISPATCH,
TKIND_INTERFACE: LoadInterface(typeInfo, typeAttr);
TKIND_COCLASS: LoadCoClass(typeInfo, typeAttr);
else
//Unknown
end;
typeInfo.ReleaseTypeAttr(typeAttr);
}
我们如何对
*.winmd
做同样的事情? WinRT 世界中的文件?
From the idl files we produce a winmd file. A winmd file is the canonical definition of the type. And that's what get handed off to the language projections. The language projections read the winmd files, and they know how to take the contents of that winmd file - which is a binary file - and then project that and produce the appropriate language constructs for that language.
They all read that winmd file. It happens to be an ECMA-335 metadata-only assembly. That's the technical detail of the packaging file format.
One of the nice things about producing winmds, because it's regular, we can now build tooling to sort, collate, combine, the methods and types in a winmd file.
RoGetMetaDataFile
加载 WinMD。但是
RoGetMetaDataFile 并不意味着让您直接处理 winmd 文件。它旨在让您发现有关您已经知道存在的类型的信息 - 并且您知道它的名称。
winmd
则失败文件名:
HSTRING name = CreateWindowsString("C:\Windows\System32\WinMetadata\Windows.Globalization.winmd");
IMetaDataImport2 mdImport;
mdTypeDef mdType;
HRESULT hr = RoGetMetadataFile(name, null, null, out mdImport, out mdType);
0x80073D54
The process has no package identity
对应 AppModel 错误代码:
#define APPMODEL_ERROR_NO_PACKAGE 15700L
但是
RoGetMetadataFile 如果你通过一个类确实成功:
RoGetMetadataFile("Windows.Globalization.Calendar", ...);
元数据分配器
IMetaDataDispenser dispenser;
MetaDataGetDispenser(CLSID_CorMetaDataDispenser, IMetaDataDispenser, out dispenser);
想必你可以使用
OpenScope 打开
winmd
的方法文件:
Opens an existing, on-disk file and maps its metadata into memory.
The file must contain common language runtime (CLR) metadata.
Scope
) 是“要打开的文件的名称”。
IUnknown unk;
dispenser.OpenScope(name, ofRead, IID_?????, out unk);
除了我不知道我应该要求什么界面;文档不会说。它确实指出:
The in-memory copy of the metadata can be queried using methods from one of the "import" interfaces, or added to using methods from the one of the "emit" interfaces.
winmd
中的命名空间或类型(这就是我们要弄清楚的)最佳答案
一个问题是 有两组文档。 IMetadataDispsenser.OpenScope :
riid
The IID of the desired metadata interface to be returned; the caller will use the interface to import (read) or emit (write) metadata.
riid
[in] The IID of the desired metadata interface to be returned; the caller will use the interface to import (read) or emit (write) metadata.
The value of riid must specify one of the "import" or "emit" interfaces. Valid values are:
- IID_IMetaDataImport
- IID_IMetaDataImport2
- IID_IMetaDataAssemblyImport
- IID_IMetaDataEmit
- IID_IMetaDataEmit2
- IID_IMetaDataAssemblyEmit
IMetadataDispsener dispener;
MetaDataGetDispenser(CLSID_CorMetaDataDispenser, IMetaDataDispenser, out dispenser);
*.winmd
您要阅读的文件。我们要求 IMetadataImport 接口(interface),因为我们要 进口 来自 winmd 的数据(而不是 导出 到 winmd): //Open the winmd file we want to dump
String filename = "C:\Windows\System32\WinMetadata\Windows.Globalization.winmd";
IMetaDataImport reader; //IMetadataImport2 supports generics
dispenser.OpenScope(filename, ofRead, IMetaDataImport, out reader); //"Import" is used to read metadata. "Emit" is used to write metadata.
Pointer enum = null;
mdTypeDef typeID;
Int32 nRead;
while (reader.EnumTypeDefs(enum, out typeID, 1, out nRead) = S_OK)
{
ProcessToken(reader, typeID);
}
reader.CloseEnum(enum);
void ProcessToken(IMetaDataImport reader, mdTypeDef typeID)
{
//Get three interesting properties of the token:
String typeName; //e.g. "Windows.Globalization.NumberFormatting.DecimalFormatter"
UInt32 ancestorTypeID; //the token of this type's ancestor (e.g. Object, Interface, System.ValueType, System.Enum)
CorTypeAttr flags; //various flags about the type (e.g. public, private, is an interface)
GetTypeInfo(reader, typeID, out typeName, out ancestorTypeID, out flags);
}
S_OK
这是一个类型引用 S_FALSE
这是一个类型定义 void GetTypeInf(IMetaDataImport reader, mdTypeDef typeID,
out String typeName, DWORD ancestorTypeID, CorTypeAttr flags)
{
DWORD nRead;
DWORD tdFlags;
DWORD baseClassToken;
hr = reader.GetTypeDefProps(typeID, null, 0, out nRead, out tdFlags, out baseClassToken);
if (hr == S_OK)
{
//Allocate buffer for name
SetLength(typeName, nRead);
reader.GetTypeDefProps(typeID, typeName, Length(typeName),
out nRead, out flags, out ancestorTypeID);
return;
}
//We couldn't find it a a type **definition**.
//Try again as a type **reference**
hr = reader.GetTypeRefProps(typeID, null, 0, out nRead, out tdFlags, out baseClassToken);
if (hr == S_OK)
{
//Allocate buffer for name
SetLength(typeName, nRead);
reader.GetTypeRefProps(typeID, typeName, Length(typeName),
out nRead, out flags, out ancestorTypeID);
return;
}
}
如果您尝试破译类型,还有一些其他有趣的陷阱。在 Windows 运行时中,从根本上来说,一切都是:
System.ValueType
--> 结构 System.Enum
--> 枚举 关于com - 如何读取 winmd(WinRT 元数据文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375771/
我正在尝试将我的 Windows Store 应用程序的 ComboBox 控件反编译为 C#,但没有代码。相反,似乎所有属性都是对单独程序集的调用。如何找到真实代码存在的位置,以及如何读取 C# 中
我想在给定路径的 .winmd 文件中输出类型。我将一个 winmd 文件从我的 Windows 8 Developer Preview 机器复制到我的开发机器。我编写了一个小型测试应用程序(使用 C
我在 VS2012 中构建我的 Windows 8 应用程序项目时收到警告: No implementation file was provided for the .winmd file 'C:\U
我有一个 Windows Phone 8 项目和另一个用 C++ 编写的项目;两者都在同一个解决方案中。 C++ 项目是 WP8 项目中使用的动态库,它被配置为在 .dll 文件之上生成 Window
我的 WPF 桌面应用程序也在使用 WinRT 类。 为了做到这一点,我遵循本教程 https://software.intel.com/en-us/articles/using-winrt-apis
我想做什么 我正在尝试创建一个库 (Arduino.dll) 以通过笔记本电脑 (Windows 10) 与我的蓝牙设备进行交互。该库旨在供桌面应用程序使用。为此,我必须引用 Windows.winm
VS 编译器不允许为 WINMD 类型库创建密封的公开类型。 为什么要设置这个限制? (我知道密封类型的优势,我的问题是关于 Win RT 组件)。 最佳答案 这是 COM 强加的架构限制。它位于任何
WinMD 是一个二进制元数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有内容。 来自 Windows Runtime design : The
我有一个问题,给定一个 .winmd 文件,我们在哪里可以找到真正的实现? .winmd 文件就像头文件或动态库的 .lib 文件一样,它不包含任何实现,我很好奇它的实现在哪里。 谢谢。 最佳答案 D
背景:我需要构建一个 Windows 运行时组件作为设置为使用 CMake 的系统的一部分生成它的构建系统。作为准备步骤,我尝试在命令行上构建它。 从一个基本的 .idl 文件 (MyType.idl
我需要以 azure 工作角色处理视频(修剪、编码等)。我没有找到任何 .net 库。但我在 Windows 套件中找到了 windows.media(winrt - Winows.winmd 文件)
我正在创建一个用于 Windows 8 开发的 winmd 文件。我想拥有出色的 JavaScript (WinJS) 体验,但不知道如何使用原始 JSON 以外的方法,例如,我希望开发人员在 Win
我有一个简单的问题,但到目前为止我还没有找到答案:How to resize jpeg image in C# WinRT/WinMD project and save it as new jpeg?
我需要实现一个包装器来将一些 native C++ 代码公开给 C#,并且遵循了本教程: http://www.silverlightshow.net/items/Windows-Phone-8-Na
我有一个使用引用库的应用程序。该库又引用 .winmd 库。 查看引用库的 IL,我可以看到这个引用: .assembly extern windowsruntime FlurryWin8SDK {
我正在使用 Unity 构建一个所谓的“通用 Windows 8.1”应用程序,并尝试让 Pushwoosh SDK 正常工作。 PushSDK.winmd 和 Newtonsoft.Json.dll
我想在旧式 VBA 用户窗体中嵌入现代 WebView2 组件(Edge Chromium 浏览器控件)。 我想我需要在系统上安装以下软件: Edge Chromium 浏览器 Webview2 SD
.NET Native 工具链如何详细处理托管 .winmd 组件库? 我知道 .NET Native 将 DLL 中的所有托管代码合并到一个可执行文件中,并在将其编译为 native 时删除未使用的
我注意到大多数(所有?).winmd 文件都有一个 255.255.255.255 版本,例如: Windows,Version=255.255.255.255,Culture=neutral,Pub
我想使用 winfbsdk(请参阅 here ),这是一个用于在 UWP(通用 Windows 应用程序 (Windows 10))内使用 Facebook 的 SDK。但似乎构建的 .winmd 文
我是一名优秀的程序员,十分优秀!