Max*_*oro 2 .net clr xslcompiledtransform
我需要支持名为'send-request'的方法作为在XSLT转换中使用的扩展函数.这是由扩展对象提供的XslCompiledTransform.关于扩展对象的酷炫之处<msxsl:script>是,我不必使用<msxsl:script>,只需声明命名空间并调用函数即可.不好的是,函数名称必须与CIL方法名称完全匹配.
所以,我想知道,是否有一种.NET语言支持方法名称中的连字符?不需要CLS合规性,使用反射调用该方法.
或者,我可以使用一些修改程序集IL的技术来更改方法名称吗?
或者,有没有办法拦截反射GetMethod调用并欺骗调用者方法'send-request'存在,但返回'SendRequest'方法呢?
你可以使用反射来做到这一点.
我使用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
}
Run Code Online (Sandbox Code Playgroud)
我在名为命名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));
Run Code Online (Sandbox Code Playgroud)
这产生了输出:
17
Run Code Online (Sandbox Code Playgroud)
我怀疑通常的.NET语言是否可行.我不知道任何允许/要求您"转义"标识符的语言.没有它,你能想象试图消除以下的歧义:
int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?
Run Code Online (Sandbox Code Playgroud)
也许有一个COBOL.NET你可以做到这一点,我不知道.
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |