2013-02-20 7 views
14

제 3 자 라이브러리를 .NET으로 포팅하는 것을 고려 중입니다. Windows 용 앱 스토어. 라이브러리는 ILGenerator.Emit 메소드 오버로드에 대한 호출을 통해 System.Reflection.Emit.OpCodes을 과도하게 사용합니다. 윈도우 스토어 앱 API에 대한 .NET에서 Windows 용 .NET의 Emit.OpCodes 용도 Store apps API?

는이 OpCode 구조와 OpCodes 클래스가 포함되어 있지만 ILGenerator 클래스가 없다, 그리고 지금까지 내가 중 하나를 대체를 찾을 수 있었다한다.

나는 분명히 뭔가를 잃었지만, 다음 ILGenerator 클래스하지 않고, 윈도우 스토어 앱 API에 대한 .NET에서 System.Reflection.Emit.OpCodeOpCodes 등의 목적은 무엇인가?

+3

좋은 질문이지만 많은 사람들이 답할 수 없을 것 같습니다. 내가 말할 수있는 것은 그들이 여전히 내부 목적에 따라 필요하고 노출에 "해를 끼치 지 않는다"는 것입니다 (LocalVariableInfo를 사용할 수있는 것처럼 많이 사용하지만, 구할 수있는 합리적인 방법은 없습니다) –

+1

@Damien_The_Unbeliever Many 이 문제를 자세히 살펴 주셔서 감사합니다. 필자는'Reflection.Emit' 네임 스페이스에 대한 경험이 거의 없으므로 물어볼 것이라고 생각했지만 분명히'OpCode'와'OpCodes'만이 왜 여전히 사용 가능한지 분명하지 않습니다 :-) –

+1

대체품이 필요하면 ILGenerator.Emit에서 Mono - Cecil을 살펴보십시오. 나는 그것을 사용하지 않았지만 다른 사람들은이를 표현 트리 해석기로 사용한다. http://www.mono-project.com/Cecil –

답변

1

좋은 질문입니다.

  • ILGenerator
    1. 사용 코드의 조각을 조립 : 나는 확실히 말할 수는 없지만, 나는 (내가 정말 상상할 수없는 그것은 뭔가 다른 사용되는) 것을 사용 연산 코드/오피 코드 생각할 수있는 두 가지 이유가 있습니다 f.ex를 사용하여 코드 조각을 분해하십시오. MethodInfo.GetMethodBody 그리고 IL 코드가 들어있는 바이트를 파싱합니다.

    이전 버전이 아니기 때문에 후자를 사용하고 있습니다. 이를위한 응용 프로그램은 정적 코드 분석입니다. 나는 그것을 f.ex로 사용한다. 일부 Mocking 비헤이비어를 구현하고 람다식이 전달되었는지 (이 경우 표현식을 사용할 수 없음)를 파악할 수 있습니다. 이 시나리오에서보다 가능성이 높은 코드 분석의 다른 응용 프로그램은 허용되지 않는 특정 클래스/메서드/구문이 사용되었는지 확인하는 것입니다 (사용자가 특정 기능을 사용하기를 원하지 않는다고 생각할 수 있습니다).

    +0

    후자를 Windows에서 사용할 수 없다는 것을 제외하고 [둘 중 하나] (http://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.aspx)를 저장하십시오. –

    +0

    글쎄, IL 바이트를 얻는 방법은 여러 가지가 있습니다. 한 가지 방법은 DLL을 어떻게 든 업로드하고 수동으로 해체하는 것입니다. 허락하신다면, 오히려 멀리 가져 왔을 것 같습니다. – atlaste

    +1

    그러나 IL 바이트를 가져 오는 데 필요한 모든 프레임 워크 메서드가 차단 된 것처럼 보입니다.네, 수동으로 해체 할 수 있습니다 - 만약 당신이 그렇게하려고한다면'OpCodes'를 스스로 정의 할 수있는 것처럼 말입니다. –

    1

    Mono Cecil은 System.Reflection의 일부 기능을 대체하는 데 유용하지만 공식적으로 WinRT 용 포트는 없지만 비공식적으로 사용할 수있는 포트는 here이며 Silverlight 버전을 기반으로합니다. Mono Cecil.

    또한 응용 프로그램 패키지 외부에서 dll 및 exe 파일을 수정할 수 없다는 점에 유의하십시오. 이는 WinRT 샌드 박스의 보안 측정 값입니다.

    +0

    고마워요, 라파엘, 나는 그것을 다시 보일 것입니다. –