2

XSLT 変換で使用される拡張関数として「send-request」という名前のメソッドをサポートする必要があります。これは、 の拡張オブジェクトによって提供されますXslCompiledTransform。拡張オブジェクトと比較して優れている点は、名前空間を宣言して関数を呼び出すだけで、<msxsl:script>を使用する必要がないことです。<msxsl:script>悪い点は、関数名が CIL メソッド名と正確に一致する必要があることです。

メソッド名でハイフンをサポートする .NET 言語はありますか? CLS 準拠は必須ではありません。メソッドはリフレクションを使用して呼び出されます。

または、アセンブリの IL を変更してメソッド名を変更する手法を使用できますか?

または、リフレクションGetMethod呼び出しを傍受し、メソッド「send-request」が存在することを呼び出し元をだまして、代わりに「SendRequest」メソッドを返す方法はありますか?

4

4 に答える 4

6

これは、リフレクションを使用して行うことができます。

ILAsm を使用して以下をアセンブリにコンパイルしました (これを実際にコンパイルするために必要なすべての綿毛を切り取りました。これらは単なる顕著なビットです (しゃれを意図しています))。

.method private hidebysig static int32 
'Te-st'() cil managed {
    // Code size       8 (0x8)
    .maxstack  1
    .locals init ([0] int32 CS$1$0000)
    IL_0000:  nop
    IL_0001:  ldc.i4.s 0x11
    IL_0002:  stloc.0
    IL_0003:  br.s       IL_0005

    IL_0005:  ldloc.0
    IL_0006:  ret
}

Programという名前の名前空間で名前が付けられたクラスでこのメソッドを定義しましたTest。メソッド名が一重引用符で囲まれていることに注意してください。これは仕様 (ECMA #335) によるものです。

識別子は、エンティティに名前を付けるために使用されます。単純な識別子は ID に相当します。ただし、ILAsm 構文では、Unicode 文字セットを使用して形成できる任意の識別子を使用できます (パーティション I を参照)。これを実現するには、識別子を一重引用符で囲みます。

それで:

var assembly = Assembly.LoadFrom(path);
var method = assembly.GetType("Test.Program")
                     .GetMethod(
                         "Te-st",
                         BindingFlags.Static | BindingFlags.NonPublic
             );
Console.WriteLine(method.Invoke(null, null));

これにより、次の出力が生成されました。

17

通常の .NET 言語ではそれが可能であるとは思えません。識別子を「エスケープ」することを許可/要求する言語は知りません。それがなければ、次のことを明確にしようとすることを想像できますか?

int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?

これを実行できる COBOL.NET があるかもしれませんが、わかりません。

于 2010-01-14T02:54:38.773 に答える
1

識別子名のハイフンは、Lisp と Scheme ではかなり一般的であるため、少なくともIronSchemeではネイティブにサポートされているのではないかと思います。Ruby の識別子ではハイフンは実際には違法であるという事実にもかかわらず、 Ruby でこのようなメソッドを作成することも非常に簡単なので、 IronRubyを使用できます。

また、@C# には不正な識別子を使用できるエスケープ機能がありますが、この場合の使用方法がよくわかりませんでした。

于 2010-01-14T03:46:59.120 に答える
0

ここでできる最も簡単なことは、メソッドを IL で直接定義することだと思います。最初に、必要な他のすべてのメソッドを持つ抽象クラスを定義します。次に、ハイフンで連結されたメソッド名を含む派生クラスを IL で定義し、それを別のライブラリにコンパイルします。

于 2010-01-14T02:36:26.813 に答える
0

CLR 言語の仕様の一部は、ランタイムがサポートする任意の名前を処理できなければならないということであると確信しています。

その場合、ランタイムがメソッド名でハイフンをサポートしている場合、たとえば VB.NET の[]構文でハイフンを宣言または使用する必要がある場合でも、すべての CLR 言語でハイフンを処理できるはずです。

于 2010-01-14T02:45:02.647 に答える