Scala コードからコンパイルされた jar ファイルから ikvmc によって生成された DLL を使用しようとしています (ええ、私の一日は素晴らしいです)。Scala コンパイラは、演算子のオーバーロードのドル記号を含む識別子を生成するようで、IKVM は生成された DLL でそれらを使用します (Reflector で確認できます)。問題は、C# コードではドル記号が違法であるため、これらのメソッドを参照できないことです。
この問題を回避する方法はありますか?
リフレクションを使用してファンキーなメソッドにアクセスできるはずです。良い解決策ではありませんが、少なくともうまくいくはずです。DLL 内の API の構造によっては、メソッドの周りにラッパーを作成して、リフレクション コードをローカライズできる場合があります。次に、コードの残りの部分から、nice ラッパーを呼び出すだけです。
別の方法として、ターゲット DLL の IL をハックして識別子を変更することもできます。または、独自のコードでビルド後の IL ハッキングを行います。
ドル記号がないように、これらの識別子の名前を変更するように IKVM に教えることはできますか? 私はあまり詳しくありませんが、簡単な検索で次のことがわかりました。
http://weblog.ikvm.net/default.aspx?date=2005-05-02
IKVM の Map.xml の文字列および複雑なデータ型!
グッドハンティング
Write synonyms for those methods:
def +(a:A,b:A) = a + b
val plus = + _
これらのメンバーにアクセスするには、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;