2012-10-09 146 views
9

我想從一個從Scala代碼編譯的jar文件中使用由ikvmc生成的DLL(是的,我的一天很棒)。 Scala編譯器似乎爲運算符重載生成包含美元符號的標識符,而IKVM使用生成的DLL中的那些(我可以在Reflector中看到它)。問題是,美元符號在C#代碼中是非法的,所以我不能引用這些方法。如何使用C#中的美元符號引用標識符?

任何方法來解決這個問題?

+2

你有一個有趣的一天,不您? –

+1

flippant的答案是「重寫DLL」。 –

+0

@AndrewCooper我確定使用Mono.Cecil可以重新編寫程序集的這些部分。 – DaveShaw

回答

6

您應該能夠使用反射訪問時髦的方法。不是一個很好的解決方案,但至少它應該工作。根據DLL中API的結構,創建一個包裝方法來定位反射代碼可能是可行的。然後從其餘的代碼中調用nice包裝器。

另一種方法是對目標DLL中的IL進行破解並更改標識符。或者對你自己的代碼進行一些構建後的IL-hacking。

1

對這些方法寫同義詞:

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

可以工作,但我主要對集合類公開的方法感興趣。我不想更改所有代碼以使用這些代碼的特殊版本。 我可能會最終創建一個特殊的Scala類中的包裝器,然後我將使用C#。 – Martin

0

我怕你將不得不使用反射才能訪問這些成員。逃跑根本不適用於你的情況。


但thoose的你,誰感興趣的逃逸機制,我寫了一個解釋。

在c#中,您可以使用@ -sign來轉義關鍵字並將它們用作標識符。然而,這並不能幫助逃避無效字符:

bool @bool = false; 

還有就是通過使用一個Unicode轉義序列不同的標識寫的方式:

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

是這個工程。但是,即使使用這個技巧,你仍然不能在標識符中使用$ -sign。嘗試...

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

...給出編譯器錯誤"Unexpected character '\u0024'"。標識符必須仍然是一個有效的標識符! c#編譯器可能會在一種預處理中解析轉義序列,並將結果標識符視爲已正常輸入

那麼,這種轉義有什麼好處?也許它可以幫助你,如果有人使用不在鍵盤上的外語字符。

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

+1

它如何回答*任何解決此問題的方法?*? –

+0

@ om-nom-nom:它不。我想探索逃脫的可能性,並表明他們不能解決問題。在我的回答中添加了最終聲明。 –

+0

給downvoters。我知道這並不能解決問題。我只是想解釋一下,即使是異國情調的逃避機制也無濟於事。探索不同的方法有什麼不對嗎? –