2012-01-22 29 views
8

Ho esaminato ECMA 335 e ho trovato solo un riferimento alla parola chiave .export che sembra promettente ma ha pochissima documentazione. Ho trovato domande simili su StackOverflow rispetto a fare questo in C#. Tuttavia, niente di tutto ciò mi ha portato in qualche modo utile finora.Come si esporta un metodo in una DLL CIL in modo che un programma nativo possa chiamarlo?

La linea di fondo è: Ho una DLL CIL e voglio richiamare alcuni dei suoi metodi statici da un'applicazione C++ nativa.

risposta

14

Nelle versioni più recenti di ILAsm, si può semplicemente fare:

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

    // code ... 
} 

Questo esporta Foo all'indice 1 nella tabella di esportazione. Gli ordinali di esportazione dovrebbero essere unici e sequenziali.

Nelle versioni più vecchie, che avrebbe dovuto fare:

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

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

    // code ... 
} 

Il .vtentry indica quale Vtable (dove 'n' è la quantità di esportazioni che si desidera.): Slot per memorizzare il metodo in. (Gli ID tabella sono sequenziali e dipendono quindi dall'ordine di dichiarazione.)

Gli ILA più recenti fanno tutto questo per te, a condizione che tu non usi la tabella di esportazione per nient'altro.

Si noti che tutto questo è molto non vendibile.

1

Devi esporre la tua dll come complemento. Com fa il lavoro di fare il nativo di .net interop. Non è possibile eseguire il codice IL in alcunché tranne VM .net.

+0

Come la soluzione di Zor mostra, è possibile senza la follia della COM. –

+0

Correggetemi se ho torto, ma ilasm genera ancora un file MSIL PE, ancora non adatto per chiamare da un'applicazione nativa. È ancora necessario un VM .net per eseguire il codice. – antiduh

+1

Il codice gestito non può funzionare magicamente senza una macchina virtuale anche se chiamato tramite COM. La mia soluzione esporta semplicemente i metodi gestiti in modo tale che, quando vengono richiamati dal codice nativo, .NET VM passi dentro e esegua il codice gestito, quindi ritorna al codice nativo. –

Problemi correlati