9

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

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

4

4 回答 4

6

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

另一种方法是破解目标 DLL 中的 IL 并更改标识符。或者对您自己的代码进行一些构建后的 IL-hacking。

于 2012-10-09T23:03:43.100 回答
4

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

http://weblog.ikvm.net/default.aspx?date=2005-05-02

IKVM 的 Remap XML 文件的格式是什么?

IKVM 的 Map.xml 中的字符串和复杂数据类型!

好狩猎

于 2012-10-09T23:31:57.443 回答
1

为这些方法编写同义词:

def +(a:A,b:A) = a + b
val plus = + _
于 2012-10-09T23:17:38.913 回答
1

我担心您将不得不使用反射来访问这些成员。在您的情况下,转义根本不起作用。


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

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

于 2012-10-09T23:21:27.883 回答