2012-10-09 14 views
9

Estoy tratando de usar una DLL generada por ikvmc desde un archivo jar compilado desde el código de Scala (sí, mi día es ESE genial). El compilador de Scala parece generar identificadores que contienen signos de dólar para las sobrecargas del operador, e IKVM los usa en la DLL generada (puedo verlo en Reflector). El problema es que los signos de dólar son ilegales en el código C#, por lo que no puedo hacer referencia a esos métodos.¿Cómo hacer referencia a identificadores con signos de dólar de C#?

¿Alguna forma de solucionar este problema?

+2

Usted está teniendo un día de diversión, no son ¿tú? –

+1

La respuesta frívola sería "reescribir la DLL". –

+0

@AndrewCooper Estoy seguro de que con Mono.Cecil puede volver a escribir esas partes del ensamblaje. – DaveShaw

Respuesta

6

Debería poder acceder a los métodos funky utilizando la reflexión. No es una buena solución, pero al menos debería funcionar. Dependiendo de la estructura de la API en la DLL, puede ser factible crear un contenedor alrededor de los métodos para localizar el código de reflexión. Luego, desde el resto de tu código, simplemente llama al simpático envoltorio.

La alternativa sería piratear el IL en el DLL de destino y cambiar los identificadores. O haz algo de hackeo de IL post-construcción en tu propio código.

1

Comentario sinónimos para esos métodos:

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

Funcionaría, pero estoy interesado principalmente en los métodos expuestos por las clases de colección. No quiero cambiar todo el código para usar una versión especial de esos. Probablemente terminaré creando envoltorios en una clase especial de Scala que luego usaré desde C#. – Martin

0

me temo que tendrá que utilizar la reflexión con el fin de acceder a esos miembros. Escapar simplemente no funciona en su caso.


Pero para aquellos de ustedes que desean escaparse de la mecánica, les he dado una explicación.

En C# puede usar @ -sign para escapar palabras clave y usarlas como identificadores. Sin embargo, esto no ayuda a escapar caracteres no válidos:

bool @bool = false; 

Hay una manera de escribir los identificadores de forma diferente mediante el uso de una secuencia de escape Unicode:

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

Si esto funciona. Sin embargo, incluso con este truco, aún no puede usar el $ -sign en un identificador. Probar ...

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

... da el error de compilación "Unexpected character '\u0024'". ¡El identificador aún debe ser un identificador válido! El compilador de C# probablemente resuelve la secuencia de escape en un tipo de preproceso y trata el identificador resultante como si se hubiera ingresado normalmente

Entonces, ¿para qué sirve este escape? Tal vez te pueda ayudar, si alguien usa un personaje de un idioma extranjero que no está en tu teclado.

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

+1

¿Cómo responde * cualquier forma de solucionar este problema? *? –

+0

@ om-nom-nom: No es así. Quería explorar las posibilidades de escape y demostrar que no pueden resolver el problema. Agregué una declaración final a mi respuesta. –

+0

Para los downvoters. Sé que esto no resuelve el problema. Solo quería explicar que incluso los mecanismos de escape exóticos no ayudarán. ¿Hay algo malo en explorar diferentes enfoques? –

Cuestiones relacionadas