我正在尝试使用由 ikvmc 从 Scala 代码编译的 jar 文件生成的 DLL(是的,我的日子很棒)。Scala 编译器似乎为运算符重载生成包含美元符号的标识符,而 IKVM 使用生成的 DLL 中的标识符(我可以在 Reflector 中看到它)。问题是,美元符号在 C# 代码中是非法的,所以我不能引用这些方法。
有什么办法可以解决这个问题?
您应该能够使用反射访问时髦的方法。这不是一个好的解决方案,但至少它应该可以工作。根据 DLL 中 API 的结构,可以在方法周围创建一个包装器以本地化反射代码。然后从您的其余代码中调用漂亮的包装器。
另一种方法是破解目标 DLL 中的 IL 并更改标识符。或者对您自己的代码进行一些构建后的 IL-hacking。
也许您可以教 IKVM 重命名这些标识符,使它们没有美元符号?我不是很熟悉,但是快速搜索一下就发现了这些:
http://weblog.ikvm.net/default.aspx?date=2005-05-02
好狩猎
为这些方法编写同义词:
def +(a:A,b:A) = a + b
val plus = + _
我担心您将不得不使用反射来访问这些成员。在您的情况下,转义根本不起作用。
但是对于那些对逃避机制感兴趣的人,我已经写了一个解释。
在 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;