2012-10-09 24 views
9

Scala kodundan derlenen bir jar dosyasından ikvmc tarafından oluşturulan bir DLL dosyasını kullanmaya çalışıyorum (evet benim günüm harika). Scala derleyicisi, operatör aşırı yüklenmeleri için dolar işaretleri içeren tanımlayıcılar üretiyor gibi görünüyor ve IKVM, oluşturulan DLL'dekileri kullanıyor (Reflektörde görebiliyorum). Sorun şu ki, dolar işaretleri C# kodunda yasadışı ve bu yüzden bu yöntemleri kullanamam.Tanımlayıcılar C# dan dolar işaretleriyle nasıl referans alınır?

Bu soruna geçici bir çözüm bulmak için herhangi bir yol var mı?

+2

, değil sen? –

+1

Flippant cevabı "DLL'yi yeniden yazabilir". –

+0

@AndrewCooper Mono.Cecil'i kullandığınızdan emin olabilirsiniz. Bu parçaları yeniden yazabilirsiniz. – DaveShaw

cevap

6

Yansımayı kullanarak korkak yöntemlere erişebilmeniz gerekir. İyi bir çözüm değil, ama en azından işe yaramalı. API'deki API yapısına bağlı olarak yansıma kodunu yerelleştirmek için yöntemler etrafında bir sarıcı oluşturmak mümkün olabilir. Ardından kodunuzun geri kalanından güzel ambalajı arayın.

alternatif hedef DLL IL üzerinde kesmek ve tanımlayıcıları değiştirmek olacaktır. Veya kendi kodunuzda post-build IL-hacking yapın. Bu yöntemlerin

1

Yaz eş:

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

Çalışırdım, ancak öncelikle koleksiyon sınıfları tarafından ortaya konan yöntemlerle ilgileniyorum. Bunların özel bir sürümünü kullanmak için tüm kodu değiştirmek istemiyorum. Büyük ihtimalle, daha sonra C# 'dan kullanacağım özel bir Scala sınıfında sarmalayıcılar oluşturacağım. – Martin

0

Ben bu elemanları erişmek için Yansıma kullanmak zorunda korkuyorlar. Kaçmak senin vakasında işe yaramıyor.


Ama sizden kurtulmak için, mekanikten kaçmakla ilgilenenler için bir açıklama yazdım.

C# size anahtar kelimeleri kaçmak ve tanımlayıcı olarak bunları kullanmak için @ işaretini kullanabilirsiniz. Ancak, bu geçersiz karakterler kaçmaya yardımcı olmuyor:

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

Evet bu işler: Unicode kaçış dizisi kullanarak farklı tanımlayıcıları yazmak için bir yol yoktur

bool @bool = false; 

. Ancak yine de bu hile ile yine bir tanımlayıcı içinde $ işaretini kullanamazsınız. ...

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

çalışılıyor ... derleyici hatası "Unexpected character '\u0024'" verir. Tanımlayıcı, geçerli bir tanımlayıcı olmalıdır! C# derleyicisi muhtemelen ön işleme, bir tür kaçış dizisi giderir ve Peki bunun için iyi kaçıyor normalde

girilmiş sanki çıkan tanımlayıcı davranır? Birisi klavyede olmayan bir yabancı dil karakterini kullanıyorsa Belki de size yardımcı olabilir.

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

+1

Nasıl cevap veriyor? * Bu soruna geçici bir çözüm bulmak için herhangi bir yol var mı? *? –

+0

@ om-nom-nom: Olmuyor. Kaçan olasılıkları araştırmak ve sorunu çözemeyeceğini göstermek istedim. Cevabım için son bir ifade eklendi. –

+0

Downvoters için. Bunun problemi çözmediğini biliyorum. Sadece egzotik kaçış mekanizmalarının bile yardım etmeyeceğini açıklamak istedim. Farklı yaklaşımları keşfetmede yanlış bir şey var mı? –

İlgili konular