2014-07-11 5 views
1

컴파일 사용 후 반사를 사용하여 가이 매개 변수와 메소드를 호출 :CodeDomCompiler 어셈블리에게 내가 반에서 메서드를 호출하기 위해 노력하고있어

bool ApproveUser(Guid userId) 

내가 어디의 .NET CodeDomCompiler 구성 요소를 사용하여 어셈블리를 컴파일하고 있습니다를 메서드를 포함하는 클래스가 상주하며 메서드가

{Void ApproveUser(System.String, Boolean ByRef, Boolean ByRef)} 

으로 컴파일되고 있습니다. 이는 예상했던 것과 완전히 다른 것입니다. Guid 매개 변수에 대한 정상적인 동작입니까? 그런 식으로 변환 할 반환 형식? 어떤 힌트를 주셔서 감사합니다. 감사!

편집 : 메서드 호출 : 나는 방법을 기대

Guid request = new Guid("25867C0D-F2FB-6A6A-AC61-FF0000852B58"); 
object[] args = new object[1] { request }; 
object classInstance= compilerResults.CompiledAssembly.CreateInstance("FooClass"); 
MethodInfo methodInfo = classInstance.GetType().GetMethod("ApproveUser"); 
bool result = (bool)methodInfo.Invoke(classInstance, args); 

성공적으로 전화를받을하는 대신 나는 다음과 같은 예외가 나타납니다

An exception of type 'System.Reflection.TargetParameterCountException' occurred in mscorlib.dll but was not handled in user code 
Additional information: Parameter count mismatch. 

편집 2 : 나는에서 매개 변수 유형을 변경 한 Guidint에 :

public bool ApproveUser(int smthg) 

T

var methodInfo = classInstance.GetType() 
       .GetMethod("ApproveUser", new[] { typeof(Guid) }); 

당신의 방법은 개인의 시도가 지정되어있는 경우 BindingFlags : 그는 컴파일 된 버전이

{Void ApproveUser(Int32, Boolean, Boolean ByRef, Boolean ByRef)} 
+4

두 개의 완전히 다른 방법을 찾고 있다고 생각합니다. –

+5

"리플렉션에서 메서드를 호출하려고합니다."- 정확하게 표현하십시오. –

+0

@SergeyBerezovskiy 나는 너무 생각했지만 그 중 하나의 메서드가 어셈블리 안에 있습니다. –

답변

2

this overloadGetMethod의 사용해보십시오 지금

var methodInfo = classInstance.GetType() 
       .GetMethod("ApproveUser", BindingFlags.Instance | BindingFlags.NonPublic); 
+0

'methodInfo'는이 경우'null'입니다. –

+0

@AlexBarac 그런 다음 원하는 메소드가 없습니다. (GetMethods) - 여기서 우리는 말할 수 없다. –

+0

@MarcGravell 나는 너와 완전히 동의한다. 내가 원하는 것은 거기에 없다. .NET에 의해 제공되는 메서드 옆에있는 것은 내가 질문에서 언급 한 것입니다. –

0

후 몇 가지 검사를 더, 나는 것을 발견 매개 변수가 기본 유형 인 경우 CodeDomProviderCompileAssemblyFromDom 메소드가 이상하게 작동합니다. 어셈블리 내부의 구조체. 그 결과, string, 등뿐만 아니라 해당 String, Int32 및 nullable 버전과 함께 Guid이 반환 유형 또는 매개 변수 유형으로 설정되면 메소드에서와 유사하게 변환됩니다. 나는 또한 다른 임의의 클래스를 테스트하고, 유일한 클래스를 사용할 때 방법 헤더는 원래, 유사합니다 :

StreamWriter ApproveUser(Stream smthg) 

{System.IO.StreamWriter ApproveUser(System.IO.Stream)} 

로 컴파일 할 것인가를이 아이디어를 알려준 그 사용하고 있던 기본 유형 대신 object을 사용하면 컴파일 결과가 만족 스러울 것입니다. 실제로,

object ApproveUser(object userId) 

는 나는 그것이 될 예상대로 반사를 통해 다음 액세스 할 수

{System.Object ApproveUser(System.Object)} 

로 컴파일됩니다. 분명히 이것은 CodeDomProvider에서 제공하는 컴파일 프로세스에서 문제가되는 것 같습니다. 희망이 다른 사람들에게도 도움이됩니다.

관련 문제