2011-11-11 5 views
0

이 질문은 this 스레드의 결과입니다.관리되는 코드로 관리되는 MarshalAs 쿼리 관리되지 않는

제 질문은 왜 일부 매개 변수에는 MarshalAs 속성을 지정해야하지만 다른 매개 변수에는 지정하지 않아야합니까? 나는 C++과 C# 데이터 유형의 차이점이 컴파일러의 방향을 요구하기에 충분히 크다고 생각 했을까? 필자 :

건배하기 전에 관리되지 않는 코드를 처리하지로

변명 나의 무지, 아담

+0

그 선언은 틀린데, 그것은 그가 문자열에 대해 널 포인터를 전달하기 때문에 작동합니다. 모든 [MarshalAs]는 실제로 제거되어야합니다. 그런 위험이 있습니다. –

답변

1

정렬 화되지 않은 매개 변수는 INTS 있습니다. ints는 int이며, int는 int이거나, 어디 에나, native이거나 아닙니다. 그래서 그들과 거래 할 특별한 지시가 필요하지 않습니다. 가치는 가치로 전달되고, 당신은 모두 설정됩니다.

포인터와 문자열이 더 까다 롭습니다. C# 문자열은 C 문자열과 같이 반드시 표현되는 것은 아니며, 단순히 null로 끝나는 문자 배열에 대한 포인터입니다. 내부 변환이 필요할 수 있습니다. 마찬가지로, 배열은 참조에 의해 전달되어야하고 그렇게하도록 명시 적으로 전달되어야합니다.

비 관리 코드에서 주소는 단지 데이터입니다. 그들에게는 특별한 것이 없습니다. 따라서 C# 컴파일러는 변수에 대해 알고있는 모든 것을 취하는 방법을 알아야하고 숫자로 변환해야합니다.

+0

아 좋아, 훌륭해. 명확한 설명, 많이 주셔서 감사합니다 :) –