저는 현재 운영자에게 새로운 문제에 직면하고 있습니다. 다음 코드를 사용하여 C#에서 if ... else
쌍을 사용할 때와 동일한 출력을 만들고 싶습니다.C# reflection : If ... else?
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Ldc_I4, 0);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S,);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
내 질문은 :
- 하는 방법은 명령어의 주소가 지점 옵 코드에 대한 매개 변수로 전달받을 수 있나요?
BR
과BR_S
,Brtrue
및Brtrue_S
,Brfalse
및Brfalse_S
및 이와 유사한 지침이 있습니까?
감사합니다.
다른 언급했듯이 분기 명령어의 "_S"버전은 4 바이트 오프셋 대신 1 바이트를 사용합니다. 분기가 항상 사용할 수있는 범위 (-128 바이트에서 +127 바이트) 내에 있다는 것을 알고 있으면이를 사용하여보다 컴팩트 한 코드를 얻게됩니다. 그러나이를 사용하여 바깥 쪽 오프셋이있는 레이블로 점프하려고하면 이 범위에서는 대리자를 만들 때 예외가 throw됩니다. – Iridium