2

.NETランタイム(CLR)を対象とするコンパイラがあります。コンパイラの現在のバージョンは、標準のC ++(非管理対象)で記述されています。コンパイラは現在、コンパイル時にアセンブリを参照するためのサポートを欠いているため、.NETライブラリを「インポート」する方法は、.NETで記述されたユーティリティスタブジェネレータを使用することです。これは、アセンブリを反映し、カスタム言語でアセンブリの署名スタブを発行します。 。使用するすべての.NETアセンブリのスタブを事前に生成します。コンパイル時に、コンパイラはスタブファイルをコンパイルしてシンボルテーブルなどにデータを入力し、.NETAPIからタイプとメソッドを解決できるようにします。それが私のバージョンの「使用」です。ただし、これは一時的なものであり、実際の「using」または「import」ディレクティブをコンパイラーに追加したいと思います。コンパイル時に、参照されるアセンブリのメタデータ/タイプ情報にアクセスする必要があります。

私の質問:管理されていないC++からCLRアセンブリメタデータにアクセスする方法についての提案が必要です。または、マネージC ++アプリに変換し、.NETリフレクションサポートを使用する理由が必要です。純粋なC++の目的は、Linux for Monoでもコンパイルできることです。さらに、CLR以外の別のランタイム用の部分的なバックエンドもあります。

4

2 に答える 2

3

これは、CoCreateObject()CLSID_CorMetaDataDispenserコクラスによって行われ、IID_IMetaDataDispenserインターフェイスを要求していると思います。IMetaDataDispenser :: OpenScope()を使用すると、アセンブリメタデータを開くことができます。IID_IMetaDataAssemblyImportを要求します。これには、メタデータを反復処理するための多数のメソッドがあります。

.NET 4.0に注意してください。もうすぐですが、メタデータ形式が変更されたと確信しています。これはメタデータを生成するための問題にすぎないはずですが、4.0バージョンのインターフェースを入手する限り、読み取りには下位互換性が必要です。 <cor.h>バージョン固有のメタデータコクラスのCLSIDがあります。

あなたはアイロニーに興味がないと思います。

于 2010-02-13T12:52:13.243 に答える
1

これは、MSDNの記事「CLRInside Out:CLR Hosting APIs」、2006年8月からのものです。

int main(int argc、_TCHAR * argv [])
{{
    //ランタイムにバインドします。
    ICLRRuntimeHost * pClrHost = NULL;
    HRESULT hrCorBind = CorBindToRuntimeEx(
        NULL、//利用可能な最新のCLRバージョンをロードする
        L "wks"、//ワークステーションGC("wks"または"svr"オーバーライド)
        0、//フラグは必要ありません
        CLSID_CLRRuntimeHost、
        IID_ICLRRuntimeHost、
        (PVOID *)&pClrHost);
 
    //ホストコントロールオブジェクトを作成します。
    DHHostControl * pHostControl = new DHHostControl(pClrHost);
    
    //このホストがホスティングマネージャーを実装していることをCLRに通知します。
    pClrHost-> SetHostControl(pHostControl);

    //ここで、CLRを開始します。
    HRESULT hrStart = pClrHost-> Start();

    //アセンブリをロードし、その中でメソッドを実行します。
    HRESULT hrExecute = pClrHost-> ExecuteInDefaultAppDomain(
        pwzAssemblyPath、pwzAssemblyName、
        pwzMethodName、pwzMethodArgs、
        &retVal);
}

別のMSDN「.NETアプリでデッドロックを回避および検出するための高度なテクニック」、2006年4月、「ホスティングAPIを介したスペランキング」に関するセクションがあります。 C /C++コード。

于 2010-02-13T03:26:16.693 に答える