我正在尝试使用由scala代码编译的jar文件中的ikvmc生成的DLL(是的,我的日子很棒)。 Scala编译器似乎生成包含运算符重载的美元符号的标识符,而IKVM使用生成的DLL中的那些(我可以在Reflector中看到它)。问题是,美元符号在C#代码中是非法的,因此我无法引用这些方法。
有什么方法可以解决这个问题吗?
答案 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;