2012-01-22 8 views
8

私はECMA 335を見直しましたが、有望だがドキュメントはほとんどない.exportキーワードへの参照が見つかりました。私はC#でこれを行うことに関して、StackOverflowに関する同様の質問を見つけました。しかし、それは今までのところ私をどこにでも導いてくれました。どのようにネイティブプログラムが呼び出すことができるように、CIL DLLのメソッドをエクスポートしますか?

私はCIL DLLを持っており、ネイティブC++アプリケーションからその静的メソッドのいくつかを呼び出したいとします。 ILASMの新しいバージョンで

答えて

14

、あなたは、単に行うことができます。

.method public static void Foo() 
{ 
    .export [1] 

    // code ... 
} 

これは、エクスポートテーブルにインデックス1にはFooをエクスポートします。輸出序列は一意かつ連続的でなければなりません。古いバージョンでは

、あなたは何をする必要があるだろう:

.data vt = int32 (0) [n] 
.vtfixup [n] int32 fromunmanaged at vt 

.method public static void Foo() 
{ 
    .vtentry 1:1 
    .export [1] 

    // code ... 
} 

(ここで 'n' をしたいの輸出量である。)

.vtentryたのvtableを示します。スロットは保存します(テーブルIDは連続しており、宣言の順序に依存します)

エクスポートテーブルを他の目的に使用しない限り、新しいILAmsがすべてこの作業を行います。

これはすべて非常に移植性が低いことに注意してください。

1

あなたはdllをcom dllとして公開する必要があります。 Comは、.net interopにネイティブを行う作業を行います。 .net VM以外でILコードを実行することはできません。

+0

Zorのソリューションが示すように、COMの狂気なしで可能です。 –

+0

私が間違っていると私を訂正しますが、ilasmはまだネイティブアプリケーションからの呼び出しには適していないPE MSILファイルを生成します。コードを実行するにはまだ.net VMが必要です。 – antiduh

+1

COM経由で呼び出されても、マネージコードはVMなしでも魔法のように実行できません。私のソリューションは、ネイティブコードから呼び出されたときに、.NET VMがステップインしてマネージコードを実行し、その後ネイティブコードに戻るという管理されたメソッドをエクスポートします。 –

関連する問題