c# 마샬링 예제

Tempo de leitura: menos de 1 minuto

0 Flares Filament.io 0 Flares ×

다음 예제에서는 Marshal 클래스에서 정의한 다양한 메서드를 사용하는 방법을 보여 주시습니다. MarshalAs 특성은 메서드 매개 변수(이 예제와 같이), 메서드 반환 값 및 구조 및 클래스 필드에 연결할 수 있습니다. 또한 메서드 반환 값에 대 한 기본 마샬링을 변경 하려면 MarshalAs 특성 메서드 자체에 연결 해야 합니다. 키-값 접근 방식을 채택하는 또 다른 이유는 응용 프로그램의 특성 때문입니다. 이 프로젝트는 다양한 유형과 형식의 이미지를 다루기 때문에 C++ 코드에서 다른 이미지 관련 메타데이터를 보내고 수신해야 합니다. EXIF 데이터를 이러한 메타데이터의 예로 생각하십시오. 이 메타데이터를 키-값 쌍 목록으로 표현하는 것이 이상적인 방법입니다. Marshal 클래스에 정의된 정적 메서드는 관리되지 않는 코드로 작업하는 데 필수적입니다. 이 클래스에 정의된 대부분의 메서드는 일반적으로 관리되는 프로그래밍 모델과 관리되지 않는 프로그래밍 모델 간의 브리지를 제공하려는 개발자가 사용합니다. 예를 들어 StringToHGlobalAnsi 메서드는 지정된 문자열(관리되는 힙)에서 관리되지 않는 힙의 버퍼에 ANSI 문자를 복사합니다. 또한 적절한 크기의 대상 힙을 할당합니다.

관리되는 구조체마샬링은 한 가지 차이점이 있는 마샬링 개체와 거의 동일합니다. Java를 비유로 사용하면 CLR을 Java VM(JVM)으로 간주합니다. 한 가지 차이점은 C#을 제외한 .NET 프레임워크에 다른 언어가 있다는 것입니다. 예를 들어 F# 및 시각적 기본입니다. 이러한 언어로 작성된 프로그램은 모두 CLR에서 실행되는 것과 동일한 중간 코드로 컴파일됩니다. 개인 보이드 MainForm_MouseDown (개체 발신자, MouseEventArgs e) { 도우미 방법.MoveObject (이. 핸들); }요약마지막으로 할 말은 MarshalAsAttribute가 항상 필요하지 않다는 것입니다. 때로는 선택 사항이며 다른 경우는 필요합니다. 예를 들어 DWORD와 같은 blittable 데이터 형식을 마샬링하는 경우 MarshalAsAttribute를 안전하게 무시할 수 있습니다. 반대로 부울 및 문자열과 같은 비blittable 데이터 형식을 마샬링하는 경우 마샬AsAttribute를 사용하여 올바른 마샬링 프로세스를 확인해야 합니다. 그러나 CLR 및 다른 개발자에게 blittable 데이터 형식에도 MarshalAsAttribute 특성을 적용하여 기본 데이터 형식에 대한 표기형을 제공하는 것이 좋습니다. 마지막으로 중요한 것은 이 장에서 관리되지 않는 환경과의 상호 운용에 대한 게이트의 핵심이었습니다.

그것은 마샬링 프로세스의 가장 중요한 부분을 논의, 당신은 항상 당신의 마음에 그것을 유지해야합니다 간단한 유형을 마샬링. 다음으로 복합 형식을 사용하여 작업하고 관리되는 환경에서 마샬링하는 방법을 배웁니다. if (ret == MB_RETURN. IDYES) 콘솔.WriteLine(“사용자가 예”를 클릭했습니다!); (ret == MB_RETURN) 경우. IDNO) 콘솔.WriteLine(“사용자가 아니오를 클릭했습니다!”); (ret == MB_RETURN) 경우. IDCANCEL) 콘솔.WriteLine(“사용자가 취소를 클릭했습니다!”); } 상수의 이름을 친숙한 이름으로 변경할 수도 있습니다. 그림 2.4는 마지막 코드 실행으로 인한 메시지 상자를 보여 주며, 마지막 코드의 실행으로 인한 메시지 상자를 보여 주며, 이 상자는 다음과 같은 것을 보여줍니다. 또한 인수 형식의 인수 형식을 열거형으로 마샬링할 수 있습니다. 다음 예제에서는 다음 예제를 보여 줍니다:목록 2.13 콘솔 표준 장치 예제 [DllImport (“Kernel32.dll”)] 정적 외신 IntPtr GetStdhandle ([param: MarshalAs(관리되지 않는 Type.U4)]콘솔_STD_HANDLE nStdHandle); /* * 이 예제에서 * StreamWriter에 의해 호출 된 메서드의 순서 : * * StreamWriter.Close() * – StreamWriter.BaseStream.Close() * – FileStream.SafeFileHandle.Close() * – SafeHandleZeroOrMinusOneIs유효 * 닫기() – – – – SafeHandle.Close() * – – – SafeHandle.ReleaseHandle() * / }하지만 SafeFileHandle 대신 IntPtr을 사용할 수 있지만 IntPtr을 허용하는 FileStream 생성자는 사용되지 않는 것으로 간주되며 생성자 (.NET 2.0 이상)를 사용해야합니다. 다음 예제에서는 사용자 지정 안전 핸들을 만드는 방법을 보여 줍니다.

Os comentários foram encerrados, mas trackbacks e pingbacks estão abertos.