2009-09-29 2 views
12

당신이 DynamicMethod constructorMethodBuilder에서 동적 IL을 생성 할 때 가시성 검사를 건너 뛸 수 있습니까?

에서 restrictedSkipVisibility 매개 변수에 대해 '사실'제공하는 경우 그렇지 않은 접근 할 것입니다 방법 및 액세스 필드를 호출하는 것이 가능 DynamicMethod를 사용하여 IL를 생성 할 때 나는 동적 어셈블리에 동적 IL을 방출하는 것을 선호 대신 생성 된 IL을 빌드 할 때 어셈블리에 저장할 수 있습니다. 이 메서드를 사용하는 경우 DynamicMethod 대신 MethodBuilder를 사용해야합니다. 그러나 나는 내 동적 코드를 실행할 때 MethodAccessException을 얻지 못하도록 가시성 검사를 건너 뛸 수 있어야합니다. 이것을 할 수있는 방법이 있습니까? 그렇다면 어떻게 할 수 있습니까?

+0

이 문제가 해결 되었습니까? 어떻게 해결했는지 간략하게 설명 할 수 있습니까? – kizzx2

+0

아니요. 내가 알 수있는 한 해결할 수 없다는 것입니다. Mono.Cecil 라이브러리를 사용하여 어셈블리를 다시 작성하여 솔루션에 대한 또 다른 접근 방식을 마무리했습니다. 이렇게하면 형식 안전 규칙을 위반하지 않고 개인 또는 내부 구성원에 액세스 할 수 있습니다. 그러나 그 방법으로 심볼을 소스 파일에 정확하게 일치시킬 수 없었기 때문에 다른 불쾌감을 유발했습니다. –

답변

2

동적 어셈블리에 MethodBuilder를 사용하면 컴파일러에서 생성 한 어셈블리와 동일한 규칙이 적용됩니다. 따라서 어셈블리 간 가시성은 다음에 의해 규율됩니다 :

문서와 샘플을 읽고 필요에 맞는지 확인하십시오.

0

생성 된 코드를 위임 대신 인터페이스로 구체화해야하는 경우 il은 Methodbuilder의 VisibilityCheck를 건너 뛰는 데 유용합니다. 직접 할 방법을 찾지 못했지만 EmitCalli (OpCodes.Calli ...)를 사용하여 MethodBuilder에서 DynamicMethod를 간단하게 호출 할 수 있습니다.

관련 문제