1

저는 Visual Basic에서 작은 응용 프로그램을 작성하도록 도청 된 C++ 프로그래밍입니다. 응용 프로그램은 IronPython 런타임을 호스팅하며 파이썬에서 일부 함수를 정의하고 VB에서 호출하려고합니다. 파이썬에서 간단한 테스트 함수를 작성했습니다.Iron Python을 호스팅하는 VB 응용 프로그램에서 PythonFunction을 호출합니다.

def test(): 
    print "Test was Called" 

그런 다음 파이썬 파일에서 ScriptSource를 생성하기 위해 철 파이썬을 사용합니다. 개체 작업을 통해 "테스트"변수를 찾을 수 있지만 그 개체를 호출하는 방법을 알아낼 수 없습니다. (VB에서) 예를 들면 : 내 코드의 tmp에서이 시점에서

pyScope = engine.CreateScope() 
pySource = engine.CreateSourceFromFile("C:\Some\File\path\test.py") 
pySource.Execute(pyScope) 
' Now I expect the function test() to be defined in pyScope 
Dim tmp as Object 
pyScope.TryGetVariable("test", tmp) 

타입 PythonFunction의 객체로 정의된다. 이 함수를 호출하는 방법을 알 수 없습니다.

tmp() 

유효한 VB 구문이 아닙니다. 지금까지이 작업을 수행해 보았습니다. 이제이 겉으로보기에는 간단한 작업을 어떻게 수행합니까?

편집 :

pyEngine.Operations.Invoke(tmp) 

를 호출하여 나는 함수를 호출 할 수와 나는 표준 출력에서 ​​예상 출력을 참조하십시오. 필자는 Python 엔진을 호출하지 않고 직접 temp를 호출 할 수있는 PythonFunction 유형의 객체를 캐스팅 할 수있는 몇 가지 함수 포인터 유형이 있다는 인상을 받고 있습니다.

답변

0

확신이 작동하지만 액션 유형으로 캐스팅하려고하지 않습니다 : 주석을 바탕으로

DirectCast(tmp, Action)() 

,이 시도 : .NET에서

engine.ObjectOperations.Invoke(tmp, Nothing) 
+0

불행히도 문제가 해결되지 않습니다. "IronPython.Runtime.PythonFunction '유형의 객체를'System.Action '을 입력 할 수 없습니다."라는 예외가 발생합니다. " – mjn12

+0

이제 우리는 어딘가로 가고 있습니다 - 제가 작업 할 수있는 유형이 있습니다. 업데이트 중. –

+0

하, 방금 전에 내가 당신의 글에 댓글을 달았 음을 발견했습니다. 설명서를 읽고 C# 예제를 보면서 tmp를 호출 형으로 변환 할 수 있어야한다고 생각합니다. http://www.voidspace.org.uk/ironpython/dark-corners.shtml#delegates-and-calltarget0을 참조하십시오. – mjn12

0

VB 4해야 C#과 같은 동적 지원이 있습니다. 당신이 할 수있을 것입니다 (아래쪽) http://msdn.microsoft.com/en-us/library/ee461504.aspx#Y5108에 따르면 이미하고있는 일이다

Dim tmp As Object = scope.GetVariable("test") 

을 ..., 그래서 확인하십시오 당신은 .NET 4

을 타겟팅 그래도 문제가 해결되지 않으면 당신은 GetVariable의 일반 버전으로 캐스팅 할 수 있어야한다 :

Dim tmp As Action = scope.GetVariable(Of Action)("test") 

마지막으로, 당신은 이미 ObjectOperations에 Invoke을 발견했다.

(VB를 모르므로이 구문을 수정해야 할 수도 있습니다.)

관련 문제