9

Scala コードからコンパイルされた jar ファイルから ikvmc によって生成された DLL を使用しようとしています (ええ、私の一日は素晴らしいです)。Scala コンパイラは、演算子のオーバーロードのドル記号を含む識別子を生成するようで、IKVM は生成された DLL でそれらを使用します (Reflector で確認できます)。問題は、C# コードではドル記号が違法であるため、これらのメソッドを参照できないことです。

この問題を回避する方法はありますか?

4

4 に答える 4

6

リフレクションを使用してファンキーなメソッドにアクセスできるはずです。良い解決策ではありませんが、少なくともうまくいくはずです。DLL 内の API の構造によっては、メソッドの周りにラッパーを作成して、リフレクション コードをローカライズできる場合があります。次に、コードの残りの部分から、nice ラッパーを呼び出すだけです。

別の方法として、ターゲット DLL の IL をハックして識別子を変更することもできます。または、独自のコードでビルド後の IL ハッキングを行います。

于 2012-10-09T23:03:43.100 に答える
4

ドル記号がないように、これらの識別子の名前を変更するように IKVM に教えることはできますか? 私はあまり詳しくありませんが、簡単な検索で次のことがわかりました。

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

IKVM のリマップ XML ファイルの形式は何ですか?

IKVM の Map.xml の文字列および複雑なデータ型!

グッドハンティング

于 2012-10-09T23:31:57.443 に答える
1

Write synonyms for those methods:

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

これらのメンバーにアクセスするには、Reflection を使用する必要があると思います。あなたの場合、エスケープは単に機能しません。


しかし、メカニックからの脱出に興味がある人のために、説明を書きました。

C# では、@ 記号を使用してキーワードをエスケープし、それらを識別子として使用できます。ただし、これは無効な文字をエスケープするのには役立ちません。

bool @bool = false;

Unicode エスケープ シーケンスを使用して、別の方法で識別子を記述する方法があります。

int i\u0064;  // '\u0064' == 'd'  
id = 5;

はい、これは機能します。ただし、このトリックを使用しても、識別子に $ 記号を使用することはできません。しようとしています...

int i\u0024;  // '\u0024' == '$'  

...コンパイラエラーが発生します"Unexpected character '\u0024'"。識別子は有効な識別子でなければなりません! C# コンパイラはおそらく一種の前処理でエスケープ シーケンスを解決し、結果の識別子を通常どおり入力されたかのように扱います。

では、この逃避は何の役に立つのでしょうか。誰かがあなたのキーボードにない外国語の文字を使用している場合、それが役立つかもしれません.

int \u00E4; // German a-Umlaut
ä = 5;

于 2012-10-09T23:21:27.883 に答える