2012-10-09 11 views
9

Sto provando ad usare una DLL generata da ikvmc da un file jar compilato dal codice Scala (sì, il mio giorno è QUELLO fantastico). Il compilatore Scala sembra generare identificatori contenenti i simboli del dollaro per i sovraccarichi dell'operatore e IKVM usa quelli della DLL generata (posso vederlo in Reflector). Il problema è che i simboli del dollaro sono illegali nel codice C# e quindi non posso fare riferimento a questi metodi.Come fare riferimento agli identificatori con il simbolo del dollaro da C#?

Un modo per aggirare questo problema?

+2

si stanno avendo una giornata di divertimento, non sono tu? –

+1

La risposta irriverente sarebbe "riscrivere la DLL". –

+0

@AndrewCooper Sono sicuro che usando Mono.Cecil puoi riscrivere quelle parti dell'assemblaggio. – DaveShaw

risposta

6

Dovresti essere in grado di accedere ai metodi funky utilizzando la riflessione. Non una bella soluzione, ma almeno dovrebbe funzionare. A seconda della struttura dell'API nella DLL, potrebbe essere possibile creare un wrapper attorno ai metodi per localizzare il codice di riflessione. Quindi dal resto del tuo codice chiama semplicemente il simpatico wrapper.

L'alternativa sarebbe quella di modificare l'IL nella DLL di destinazione e modificare gli identificatori. O fai un po 'di IL-hacking post-build sul tuo codice.

1

Scrivi i sinonimi di quei metodi:

def +(a:A,b:A) = a + b 
val plus = + _ 
+1

Funzionerebbe, ma sono principalmente interessato ai metodi esposti dalle classi di raccolta. Non voglio cambiare tutto il codice per usare una versione speciale di quelli. Probabilmente finirò per creare wrapper in una speciale classe di Scala che userò da C#. – Martin

0

temo che si dovrà utilizzare la riflessione al fine di accedere a tali membri. La fuga semplicemente non funziona nel tuo caso.


Ma per thoose di voi, che interessati a fuggire meccanica ho scritto una spiegazione.

In C# è possibile utilizzare @ -sign per sfuggire alle parole chiave e utilizzarle come identificatori. Tuttavia, questo non aiuta a scappare caratteri non validi:

bool @bool = false; 

C'è un modo per scrivere identificatori in modo diverso utilizzando una sequenza di escape Unicode:

int i\u0064; // '\u0064' == 'd' 
id = 5; 

Sì, questo funziona. Tuttavia, anche con questo trucco non puoi ancora usare $ -sign in un identificatore. Cercando ...

int i\u0024; // '\u0024' == '$' 

... dà l'errore del compilatore "Unexpected character '\u0024'". L'identificatore deve essere ancora un identificatore valido! Il compilatore C# risolve probabilmente la sequenza di escape in una sorta di pre-elaborazione e tratta l'identificatore risultante come se fosse stato immesso normalmente

Quindi, a cosa serve questo scappare? Forse può aiutarti, se qualcuno usa un personaggio di lingua straniera che non è sulla tua tastiera.

int \u00E4; // German a-Umlaut 
ä = 5; 

+1

Come risponde su * Un modo per aggirare questo problema? *? –

+0

@ om-nom-nom: non è così. Volevo esplorare le possibilità di fuga e mostrare che non possono risolvere il problema. Aggiunta una dichiarazione finale alla mia risposta. –

+0

Per i downvoters. So che questo non risolve il problema. Volevo solo spiegare che anche i meccanismi di fuga esotici non saranno d'aiuto. C'è qualcosa di sbagliato nell'esplorare approcci diversi? –