如何使用C#中的美元符号引用标识符?

时间:2012-10-09 22:42:53

标签: c# scala ikvm

我正在尝试使用由scala代码编译的jar文件中的ikvmc生成的DLL(是的,我的日子很棒)。 Scala编译器似乎生成包含运算符重载的美元符号的标识符,而IKVM使用生成的DLL中的那些(我可以在Reflector中看到它)。问题是,美元符号在C#代码中是非法的,因此我无法引用这些方法。

有什么方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:6)

您应该能够使用反射访问时髦的方法。不是一个好的解决方案,但至少它应该工作。根据DLL中API的结构,可以创建围绕方法的包装器来本地化反射代码。然后从你的其余代码中调用好的包装器。

另一种方法是破解目标DLL中的IL并更改标识符。或者在你自己的代码上做一些后期构建IL-hacking。

答案 1 :(得分:4)

也许你可以教IKVM重命名这些标识符,使它们没有美元符号?我不是很熟悉,但快速搜索指出了我:

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!

好狩猎

答案 2 :(得分:1)

为这些方法编写同义词:

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

答案 3 :(得分:1)

我担心您必须使用Reflection才能访问这些成员。逃脱根本不适用于你的情况。


但对于那些对逃避机械感兴趣的人,我写了一个解释。

在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;