問題タブ [winmd]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3468 参照

com - winmd (WinRT メタデータ ファイル) を読み取るには?

WinMD はバイナリ メダデータ ファイルであり、名前空間、型、クラス、メソッド、ネイティブ WinRT dll で使用できるパラメーターについて学習するために必要なすべてが含まれています。

Windows ランタイム設計から:

Windows ランタイムは、API メタデータ (.winmd ファイル) を使用して公開されます。これは、.NET フレームワーク (Ecma-335) で使用される形式と同じです。基になるバイナリ コントラクトにより、選択した開発言語で直接 Windows ランタイム API に簡単にアクセスできます。

各 .winmd ファイルは、1 つ以上の名前空間を公開します。これらの名前空間は、提供する機能によってグループ化されています。名前空間には、クラス、構造体、列挙型などの型が含まれています。

偉大な; どうすればアクセスできますか?

Winmd は COM です

内部の WinRT は引き続き COM です。また、WinRT の Winmd (Windows メタデータ) は、COM の古い TLB (タイプ ライブラリ) ファイルの最新バージョンです。

COM tlb からのメタデータの読み取り

COM tlb ファイル (例: stdole.tlb) を指定すると、さまざまな Windows 関数を使用して tlb を解析し、そこから情報を取得できます。

LoadTypeLibを呼び出すと、ITypeLibインターフェイスが取得されます。

そして、タイプ ライブラリ内のすべての反復処理を開始できます

*.winmdWinRT の世界のファイルで同じことを行うにはどうすればよいでしょうか?

ラリー・オスターマンより:

idl ファイルから winmd ファイルを生成します。winmd ファイルは、型の標準的な定義です。そして、それが言語プロジェクションに渡されます。言語プロジェクションは winmd ファイルを読み取り、バイナリ ファイルであるその winmd ファイルの内容を取得して、それを投影し、その言語に適した言語構造を生成する方法を知っています。

それらはすべてその winmd ファイルを読み取ります。たまたま ECMA-335 メタデータのみのアセンブリです。これは、パッケージ ファイル形式の技術的な詳細です。

winmd を生成することの良い点の 1 つは、それが規則的であるため、winmd ファイル内のメソッドと型を並べ替え、照合、結合するためのツールを構築できるようになったことです。

winmd からのメタデータの読み込み

RoGetMetaDataFileWinMDをロードするために使用してみました。ただし、RoGetMetaDataFileは、winmd ファイルを直接処理できるようにするためのものではありません。これは、既に存在し、その名前を知っている型に関する情報を発見できるようにすることを目的としています。

ファイル名を渡すと、RoGetMetadataFileの呼び出しは失敗しwinmdます。

これは AppModel エラー コードに対応します。

ただし、クラスを渡すとRoGetMetadataFileは成功します。

メタデータ ディスペンサー

MetaDataGetDispenserを使用してIMetaDataDispenserを作成するという提案がありました。

おそらく、 OpenScopeメソッドを使用してwinmdファイルを開くことができます。

ディスク上の既存のファイルを開き、そのメタデータをメモリにマップします。
ファイルには、共通言語ランタイム (CLR) メタデータが含まれている必要があります。

最初のパラメーター ( Scope) は、「開くファイルの名前」です。

そこで、次のことを試みます。

私が求めているはずのインターフェースがわからないことを除いて。ドキュメントは言いません。それは次のように述べています。

メタデータのメモリ内コピーは、「インポート」インターフェイスの 1 つからのメソッドを使用してクエリを実行したり、「発行」インターフェイスの 1 つからのメソッドを使用して追加したりできます。

「インポート」「エミット」という言葉に重点を置いた著者は、おそらく手がかりを提供しようとしていますが、答えをあからさまに与えることはありません。

ボーナスおしゃべり

  • の名前空間または型がわかりませんwinmd(それが私たちが理解しようとしているものです)
  • WinRT では、CLR 内でマネージ コードを実行していません。これはネイティブコード用です

この質問に使用できる仮説的な動機は、まだ存在しない言語 (ada、bpl、b、c など) のプロジェクションを作成することです。もう 1 つの仮説的な動機は、IDE が wi​​nmd ファイルのメタデータ コンテンツを表示できるようにすることです。

また、WinRT は .NET とはまったく関係がないことに注意してください。

  • マネージド コードではありません。
  • アセンブリには存在しません。
  • .NET ランタイム内では実行されません。
  • しかし、.NET は既に COM と相互運用する方法を提供しているため (WinRTCOM であることを考えると)
  • マネージド コードから WinRT クラスを呼び出すことができる

多くの人は、WinRT は .NET の別名だと考えているようです。WinRT は、.NET、C#、.NET フレームワーク、または .NET ランタイムを使用、要求、または動作しません。

  • WinRT はネイティブ コードへ
  • .NET Framework クラス ライブラリはマネージ コードに対するものです。

WinRT は、ネイティブ コード用のクラス ライブラリです。.NET ユーザーは、独自のクラス ライブラリを既に持っています。

ボーナス質問

ECMA-335 バイナリ ファイルのメタデータを処理できるネイティブ mscore の関数は何ですか?

ボーナスリーディング

0 投票する
1 に答える
189 参照

com - IMetadataImport を使用して列挙値を取得する方法

短縮版

IMetadataImportを使用するときに、ファイルから列挙型に関連付けられた数値を取得するにはどうすればよいですか?*.winmd

良い例は、ApplicationHighContrastAdjustment列挙です。

ほとんどの列挙は0, 1, 2, .... ただし、これには列挙型メンバーで指定された他の値があります。

  • 0
  • 4294967295

これらのUInt32値を取得するにはどうすればよいですか

: この質問は、WinRT だけに当てはまる必要はありません。C# の世界では、.NET マネージ アセンブリを検査するために同じインターフェイスが使用されます。WinRT はたまたま同じアセンブリ ファイル形式を使用しています。

ロングバージョン

(WinRT アプリケーション用の最新バージョンの TLB)IMetadataImportの内容を読み取るために使用しています。*.winmdしかし、問題は .NET マネージ アセンブリに関するメタデータの読み取りにも同様に当てはまります。

winmd メタデータ ファイルの読み取りを開始して実行する方法の要約版:

列挙型に関する情報の取得 (自動、なし)

これでリーダーができました。アセンブリ内の型を列挙するのではなく、この質問の興味深い型に直接ジャンプできます: 0x02000006:

を呼び出すとEnumMembers、列挙型の 3 つのメンバーが返されます。

  • Windows.UI.Xaml.ApplicationContrastMode (@02000006)
    • value__ (@04000439、非公開)
    • なし(@0400043A、公開)
    • 自動(@0400043B、公開)

各列挙値の情報を取得する

GetMemberPropsを呼び出すことで、実際に名前 (および 1 つが非公開であるという事実) を見つけます。

: GetMemberProps はヘルパー関数です。マイクロソフトから:

これは単純なヘルパー メソッドです。md が MethodDef の場合GetMethodPropsを呼び出します。mdが FieldDef の場合、 GetFieldPropsを呼び出します。詳細については、これらの他の方法を参照してください。

GetMemberPropsメソッドは、各列挙値に関する情報のホスト全体を返しますが、実際の列挙値返しません。

列挙型に割り当てられた値を示すメンバー プロパティが見つかりません。他のIMetadataImporterメソッドを見ると、次のようになります。

  • IMetdataImporter
    • GetMemberProps (GetMemberProps は、型に応じて GetMethodProps または GetFieldProps を呼び出すヘルパーです)
      • GetMethodProps
      • GetFieldProps
    • GetPropertyProps
    • GetEventProps
    • GetParamProps
    • GetInterfaceImplProps
    • GetCustomAttributeProps
    • GetTypeDefProps
    • GetTypeRefProps
    • GetScopeProps
    • GetPermissionSetProps
    • GetModuleRefProps
    • GetNestedClassProps
    • GetMemberRefProps

ボーナスリーディング

  • MSDN ブログ: Metadata Unmanaged API (私の知る限り、Metadata API に関する唯一の Microsoft ドキュメントである古い Word ドキュメントの予備 PDF バージョン) (アーカイブ)