私はScalaコードからコンパイルされたjarファイルからikvmcによって生成されたDLLを使用しようとしています(私の日はすばらしいです)。 Scalaコンパイラは演算子オーバーロードのドル記号を含む識別子を生成し、IKVMは生成されたDLLの識別子を使用します(これはReflectorで見ることができます)。問題は、ドル記号がC#コードでは不正であるため、これらのメソッドを参照できないということです。C#のドル記号で識別子を参照する方法は?
この問題を回避する方法はありますか?
私はScalaコードからコンパイルされたjarファイルからikvmcによって生成されたDLLを使用しようとしています(私の日はすばらしいです)。 Scalaコンパイラは演算子オーバーロードのドル記号を含む識別子を生成し、IKVMは生成されたDLLの識別子を使用します(これはReflectorで見ることができます)。問題は、ドル記号がC#コードでは不正であるため、これらのメソッドを参照できないということです。C#のドル記号で識別子を参照する方法は?
この問題を回避する方法はありますか?
リフレクションを使用してファンキーな方法にアクセスできるはずです。素晴らしい解決策ではありませんが、少なくともそれはうまくいくはずです。 DLL内のAPIの構造によっては、リフレクションコードをローカライズするためにメソッドの周りにラッパーを作成することが可能です。それから、残りのコードからniceラッパーを呼び出してください。
代わりに、ターゲットDLLのILをハックして識別子を変更することもできます。また、独自のコードでビルド後IL-Hackingを行うこともできます。
は、これらのメソッドの同義語を書く:
def +(a:A,b:A) = a + b
val plus = + _
うまくいくかもしれませんが、私は主にコレクションクラスによって公開されるメソッドに興味があります。私はそれらの特別なバージョンを使用するためにすべてのコードを変更したくありません。 私はおそらく、C#から使用する特別なScalaクラスでラッパーを作成することになります。 – Martin
私はあなたがそれらのメンバにアクセスするためにリフレクションを使用する必要がありますことを恐れています。エスケープは単にあなたのケースでは機能しません。
しかし、私は説明を書いてきた仕組みをエスケープに興味がありますのthoose、ため。
c#では、キーワードをエスケープして識別子として使用するために@記号を使用できます。しかし、これは無効な文字をエスケープするのに役立ちません。
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;
どのように答えますか*この問題を回避する方法はありますか? –
@ om-nom-nom:そうではありません。私は脱出可能な可能性を探求し、問題を解決できないことを示したかったのです。私の答えに最終的な声明を追加しました。 –
downvotersに。私はこれが問題を解決しないことを知っています。私は、エキゾチックなエスケープメカニズムでさえ助けにならないと説明したかっただけです。さまざまなアプローチを探るのに間違っていますか? –
おそらくあなたは、彼らはドル記号を持っていないように、これらの識別子の名前を変更する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!
良い狩猟
ああ!本当に面白い!私の問題を解決するかもしれない、私は一見を持っています。 – Martin
あなたは楽しい一日持っている、ではありません君は? –
ちらつきの答えは "DLLを書き換える"でしょう。 –
@AndrewCooper Mono.Cecilを使用して、アセンブリのこれらの部分を書き直すことができます。 – DaveShaw