我想從一個從Scala代碼編譯的jar文件中使用由ikvmc生成的DLL(是的,我的一天很棒)。 Scala編譯器似乎爲運算符重載生成包含美元符號的標識符,而IKVM使用生成的DLL中的那些(我可以在Reflector中看到它)。問題是,美元符號在C#代碼中是非法的,所以我不能引用這些方法。如何使用C#中的美元符號引用標識符?
任何方法來解決這個問題?
我想從一個從Scala代碼編譯的jar文件中使用由ikvmc生成的DLL(是的,我的一天很棒)。 Scala編譯器似乎爲運算符重載生成包含美元符號的標識符,而IKVM使用生成的DLL中的那些(我可以在Reflector中看到它)。問題是,美元符號在C#代碼中是非法的,所以我不能引用這些方法。如何使用C#中的美元符號引用標識符?
任何方法來解決這個問題?
您應該能夠使用反射訪問時髦的方法。不是一個很好的解決方案,但至少它應該工作。根據DLL中API的結構,創建一個包裝方法來定位反射代碼可能是可行的。然後從其餘的代碼中調用nice包裝器。
另一種方法是對目標DLL中的IL進行破解並更改標識符。或者對你自己的代碼進行一些構建後的IL-hacking。
對這些方法寫同義詞:
def +(a:A,b:A) = a + b
val plus = + _
可以工作,但我主要對集合類公開的方法感興趣。我不想更改所有代碼以使用這些代碼的特殊版本。 我可能會最終創建一個特殊的Scala類中的包裝器,然後我將使用C#。 – Martin
我怕你將不得不使用反射才能訪問這些成員。逃跑根本不適用於你的情況。
但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;
它如何回答*任何解決此問題的方法?*? –
@ om-nom-nom:它不。我想探索逃脫的可能性,並表明他們不能解決問題。在我的回答中添加了最終聲明。 –
給downvoters。我知道這並不能解決問題。我只是想解釋一下,即使是異國情調的逃避機制也無濟於事。探索不同的方法有什麼不對嗎? –
也許你可以教IKVM重命名這些標識符,使得他們沒有美元符號?我不是超級familar,但快速搜索我指出這些:
http://weblog.ikvm.net/default.aspx?date=2005-05-02
What is the format of the Remap XML file for IKVM?
String and complex data types in Map.xml for IKVM!
好狩獵
啊!確實非常有趣!可能解決我的問題,我會看看。 – Martin
你有一個有趣的一天,不您? –
flippant的答案是「重寫DLL」。 –
@AndrewCooper我確定使用Mono.Cecil可以重新編寫程序集的這些部分。 – DaveShaw