2009-11-13 3 views
2

바이트 배열 가져 오기 COM 서버에서 C#으로 메모리 덩어리 (즉 void *)를 얻는 가장 좋은 방법은 무엇입니까?프로세스 외부에서 C++ COM으로 C#

우리는 IStream (CreateStreamOnHGlobal 사용)을 사용하고 그것을 돌아가며 작동했습니다. 그러나 x32 C++ COM을 사용하여 x64 CLR에서이 문제를 해결하려고하면 불어납니다.

COM은 외부 32 비트 DLL을 사용하기 때문에 x32 여야합니다. C#은 32 비트를 실행해야하지만 어려움은 x64로 계속 실행하는 것입니다.

답변

1

내 질문에 답해주세요.

자신의 COM 서버에서 IStream을 반환하면 .NET interop DLL은 해당 인터페이스에 IStream을 넣습니다. 예를 들어, 타입 라이브러리가 MyComServer이면, interop에는 MyComServer.Interop.IStream 클래스가 포함됩니다.

이 IStream 클래스에는 RemoteRead, RemoteWrite 등과 같은 기능이 있습니다. 이들은 첫 번째 매개 변수로 ref 바이트를 사용합니다. 이러한 것들을 32 비트에서 32 비트로 잘 사용했지만 ref가 아마도 포인터가되어 64에서 32로 잘못되었다.

해결책은 MyComServer.Interop.IStream을 System.Runtime.InteropServices.ComTypes.IStream로 변환하고 "as"(또는 아마도 캐스팅)를 사용하는 것입니다. 그런 다음 반환 크기에 대해 더 익숙한 byte [], int count 및 IntPtr을 사용합니다. 그것이 아웃 INT 될 수 있기

을 IntPtr 성가신,하지만 난 사용 (그래서 확인 컴파일러하지 손이에 입력 ..)

byte[] buffer = new byte[100]; 
IntPtr ptr = Marshall.AllocHGlobal(sizeof(int)); 
stream.Read(buffer, 100, ptr); 
0

.NET 3.5를 사용하는 경우 System.IO.Pipes을 살펴보십시오. 잘 알려진 파이프 이름을 만들고 Win32 named pipes APIs으로 관리되지 않는 코드에서 덮어 씁니다.

+0

슬프게 때로는있어 여전히 .NET 2.0 (고객 여전히 3.5를 설치하는 것을 좋아하지 않습니다 - 윈도우 7이 가장 오래 걸릴 때, 어쨌든 그것을 가질 것입니다. 비스타를 설치하지 않은 사람들은 그것을 사용하지 못하게합니다) – MrPurpleStreak