2014-12-24 4 views
1

IronPython에서 호출하려고하는 C# 함수가 있습니다. 내가 일 동안 해결하려고 노력했지만 일을 아무것도 얻을 수 없다 ...로IronPython, Byte에 대한 참조 전달

다음 작업을 수행 할
public status extern int OpenNetPort(int Port, string IPaddr, ref byte ComAddr, ref int PortHandle) 

...

clrType = Type.GetType('System.Byte') 

d = 0 
comAdr = clr.Reference[Byte](clr.Convert(d, clrType)) 
rfidHandle = StaticClassReaderB.OpenNetPort(27011, '192.168.0.250', comAdr, 27011) 

I get the following when running... 
TypeError: expected Byte, got StrongBox[Byte] 

을 정의합니다. 감사합니다.

+0

저에게 C# 기능처럼 보이지 않습니다. C++에 가깝습니다. – itsme86

+0

글쎄, 내가 중국에있는 회사에서 얻은 문서에 정의 된 바와 같다. Visual Studio에서 함수를 보면 ... public 상태 extern int OpenNetPort (int 포트, 문자열 IPaddr, ref 바이트 ComAddr, ref int PortHandle) – StringCheeseCR

+0

음 * * *는 C#과 유사합니다. LPSTR, unsigned char 매개 변수는 모두 C#이 아닙니다. 나는 당신이 질문에 한 가지 방법으로 정의를 게시 한 이유와 의견에 다른 방법을 게시 한 이유를 잘 모릅니다. – itsme86

답변

1

호출의 두 번째 ref 인수가 잘못되었다고 생각합니다. 어떤 이유로 IronPython 메시지가 오해의 소지가 있습니다.

C# 프로토 타입은 아직 명확하지 않으며 더 많은 놀라움을 숨길 수 있습니다.

C#을

namespace callingdotnet { 
    public class Callingdotnet { 
     public static int OpenNetPort(int Port, string IPaddr, ref byte ComAddr, ref int PortHandle) { 
      Console.WriteLine("port: " + Port); 
      Console.WriteLine("IPaddre: " + IPaddr); 
      Console.WriteLine("ComAddr: " + ComAddr); 
      Console.WriteLine("PortHandle: " + PortHandle); 
      ComAddr = 42; 
      PortHandle = 0xdead; 
      return 0; 
     } 
    } 
} 

IronPython의 :

import System 
import clr 

clr.AddReferenceToFileAndPath(r"bin\debug\callingdotnet.dll") 
import callingdotnet 

d = 123 
comAddr = clr.Reference[System.Byte](d) 
p = 423564 
PortHandle = clr.Reference[System.Int32](p) 

ret = callingdotnet.Callingdotnet.OpenNetPort(27011, '192.168.0.250', comAddr, PortHandle) 
print "-"*40 
print "ret = ", ret 
print "comAddr: ", comAddr.Value 
print "PortHandle: %x" % PortHandle.Value 

출력 :

$ ~/github/IronLanguages/bin/Debug/ipy.exe -S example-byte-ref.py 
port: 27011 
IPaddre: 192.168.0.250 
ComAddr: 123 
PortHandle: 423564 
---------------------------------------- 
ret = 0 
comAddr: 42 
PortHandle: dead 
방법의 최종 서명을 확인하려면 당신은 내가 만든 추가 된 가정 ildasm

전체 예제를 사용할 수 있습니다

+0

감사합니다! 두 번째 참조 인수가 문제의 원인이었고 오류 메시지가 오도 된 것이라고 맞았습니다. 고마워요 파블! – StringCheeseCR

+1

문제점 https://github.com/IronLanguages/main/issues/1151을 열었습니다. –