문제

나를 지원하는 데 필요한 방법이라는'보내는 요청'으로 확장하려는 기능에 사용되는 XSLT 변환입니다.이 제공하는 확장자체에서 XslCompiledTransform.이 멋진 일에 대한 확장자체를 대 <msxsl:script> 는 것이 아니라,나는 사용하지 않아도 <msxsl:script>, 에,당신은 그냥 선포하는 네임스페이스와 호출 기능입니다.나쁜 것은 함수 이름이 정확히 일치해야 합니다 CIL 메서드 이름입니다.

그래서,저는지 궁금하이 있습니다.NET 언어로 지원하는 하이픈에서 메서드 이름을 가지고 있을까요?CLS 규정 준수하지 않은 필요한 메소드가 호출을 사용하여 반영합니다.

또는,사용할 수 있는 몇 가지 기법을 수정하 IL 어셈블리의 변경 방법은?

또는 방법이 있을 차단하기 위해 반사 GetMethod 전화 속 호출하는 방법을'-보내는 요청을'있지만 반환'SendRequest'방법을까요?

도움이 되었습니까?

해결책

반사를 사용하여이를 수행 할 수 있습니다.

나는 Ilasm을 사용하여 다음을 어셈블리로 컴파일했습니다 (나는 이것을 실제로 컴파일하는 데 필요한 모든 보풀을 잘라냅니다. 이것들은 단지 두드러진 비트 (pun 의도)입니다.

.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 Syntax는 유니 코드 문자 세트를 사용하여 형성 할 수있는 모든 식별자를 사용할 수 있습니다 (파티션 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 및 체계에서 매우 일반적이므로 기본적으로 지원되는 것으로 생각됩니다. 아이언 스케인, 적어도. 루비에서 이와 같은 방법을 만드는 것은 매우 쉽습니다. ~에도 불구하고 Hypens가 실제로 Ruby 식별자에서 불법이라는 사실은 아이언 루비.

또한, @ C#의 Escape-Thingy는 다른 방법으로 불법 식별자를 사용할 수 있지만이 경우에 사용하는 방법을 알 수 없었습니다.

여기서 할 수있는 가장 간단한 일은 IL에서 직접 메소드를 정의하는 것입니다. 먼저 원하는 다른 메소드가있는 추상 클래스를 정의하십시오. 그런 다음 하이픈 메소드 이름이 포함 된 IL에서 파생 클래스를 정의하고 별도의 라이브러리로 컴파일하십시오.

나는 합리적으로는 부분의 사양에 대한 CLR 언어들을 처리할 수 있어야 합니다 어떤 이름을 런타임이 지원하는 경우에도,그것은 것을 일어나 예약한 키워드에서는 언어나 그렇지 않으면 불법입니다.

가정하는 경우,경우 런타임 지원이픈에서 메서드 이름이 모든 CLR 언어를 처리할 수 있어야 합니다 그들에게는 경우에도,그것은 필요 뭔가 좋아 예:VB.NET ko [] 구문을 선언 또는 그들을 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top