2016-07-04 14 views
2

.NETネイティブツールチェーンは管理された.winmdコンポーネントライブラリを詳細に扱う方法を教えてください。ユニバーサルWindows .NETネイティブおよびwinmdコンポーネントライブラリ

.NETネイティブでDLLからのすべてのマネージコードを1つの実行可能ファイルにマージし、ネイティブにコンパイルするときに未使用のコードを削除することがわかりました。

しかし、.winmd管理ライブラリにはどのアルゴリズムが使用されていますか?たとえば、WinRTのバックグラウンドタスク(オーディオバックグラウンドタスクなど)はwinmdライブラリでホストされ、これらのタスクはwinmd提供クラスを動的に呼び出すシステム提供のネイティブプロセス内でホストされます。 .NETネイティブコンセプトとどのように互換性がありますか?

.NETネイティブで管理された.winmdコードがネイティブに変換されず、環境が.NETランタイムにフォールバックされて管理されたwinmdでコードが実行されるため、ネイティブコンパイル済み実行可能ファイルの利点が失われる可能性があります。またはそれはどのように機能しますか?

この情報はあまり明確ではありません。 MSDNのドキュメントには、管理されたwinmdコンポーネントライブラリと.NETネイティブツールチェーンに関する詳細情報はありません。

+1

それは.NETアセンブリ内の.NETメタデータからまったく異なる、メタデータだけではありません。モジュールからエクスポートされるタイプについて説明します。それはアンマネージドコードでも動作する点を除いて、このようなバックグラウンドタスクをC++でも書くことができます。実際、.winmdの形式は.NETメタデータの形式とまったく同じ*ですので、ildasm.exeのような.NETデコンパイラを使用して見ることができます。それについて特に神秘的なものはありませんが、この「心配」は無意味です。 –

+0

@HansPassant私の質問は、.NETネイティブツールチェーンとどのように連携するかです。 –

答えて

2

私は.NETネイティブチームで働いています。私は明確にするのを手伝ってくれるでしょう。

.NETネイティブは管理されたWinMDアセンブリをネイティブコードに変換し、それをアプリケーションDLLと一緒にマージします(本日時点)。バックグラウンドタスクプロセスがそれらの管理されたWinRTクラスのネイティブコードを見つけるために、アプリケーションマニフェストを修正して、現在DLLのネイティブコードを持つアプリケーションDLLを指すようにします。タスクのバックグラウンドプロセスは、アプリケーションDLLをうまく読み込み、WinRTアクティベーションプロトコル/ ABIを使用して、アプリケーションDLLでホストされているネイティブコードで実装されている管理WinRTタイプを有効にします。 JITtingは必要ありません。

疑いがあるように、どのWinRTクラスがネイティブコードからアクティブ化されているかを見つけることにはいくつか興味深い課題があります。今日我々は、管理されたWinMDのすべての公開WinRTクラスを.NETネイティブコンパイラのコンパイルルーツとして扱い、それらから到達可能なすべてのものを保守的に扱います。サイズにはいくつかの意味がありますが、それはJITを利用できないこととのトレードオフです。

おかげで、 李チャン

+0

答えをありがとう。今はすべてがクリアです。 –

関連する問題