我需要支持一个名为在XSLT转换中使用“发送请求”作为扩展功能的方法。这是通过在XslCompiledTransform扩展对象提供。关于延长很酷的事情对象与<msxsl:script>是,好,那我就不必使用<msxsl:script>,你只需要声明的命名空间,并调用该函数。坏事是,函数名称必须与CIL方法名称相匹配。

所以,我想知道,有没有支持方法名连字符.NET语言? CLS遵从性不是必需的,该方法是使用反射调用。

或者,可予使用一些技术,修改一个组件的IL改变方法名?

或者,有一种方法来拦截反射GetMethod呼叫及特技的是,方法“发送请求”存在于呼叫者,但返回一个“sendRequest将”方法,而不是

有帮助吗?

解决方案

可以做到这一点使用反射。

我编译以下到使用ILASM的组件(I切出一切必要的绒毛,使这个实际编译;这些只是凸位(双关语意)):

.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在那里你可以做到这一点,我不知道。

其他提示

连字符在标识符名称是在Lisp和Scheme很常见的,因此我怀疑它在 IronScheme ,至少。它也很容易在Ruby中创建这样的方法,尽管的事实,hypens实际上是Ruby的标识符是非法的,所以你可以使用的 IronRuby的

此外,还有在C#中@逃生啄,允许您使用其他非法标识,但我不能完全弄清楚如何使用它的这种情况下。

我想你可以在这里做最简单的事情是直接在IL定义方法。首先定义其中有你想要所有其他方法的抽象类。然后定义在IL派生类含有hyphen'd方法名称和其编译成一个单独的库。

我有理由相信,该规范的CLR语言的部分是,他们必须能够处理任何名称的运行环境支持,即使它正好是在语言或其他非法保留关键字。

假如是这样的话,如果运行时支持方法名连字符,那么所有CLR语言应该能够处理它们,即使它需要像例如VB.NET的[]语法来声明或使用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top