Отвечая на мой вопрос.
Когда вы возвращаете IStream со своего собственного COM-сервера, DLL-библиотека взаимодействия .NET помещает IStream в его интерфейс. Например, допустим, что библиотекой типов является MyComServer, тогда взаимодействие будет содержать класс MyComServer.Interop.IStream.
этот класс IStream имеет такие функции, как RemoteRead, RemoteWrite и т. Д. В качестве первого параметра они принимают реф байт. Их использование отлично работало на 32-битных и 32-битных системах, но этот ref, вероятно, становится указателем, и поэтому на 64-битных или 32-х битах что-то пошло не так.
Решение состоит в том, чтобы преобразовать MyComServer.Interop.IStream в System.Runtime.InteropServices.ComTypes.IStream, используя «as» (или просто приведение, вероятно). Это тогда берет более знакомый byte [], int count и IntPtr для возвращаемого размера.
IntPtr раздражает, так как это может быть out int, но я использовал (набирал это вручную, чтобы не проверял компилятор ..)
byte[] buffer = new byte[100];
IntPtr ptr = Marshall.AllocHGlobal( sizeof(int) );
stream.Read( buffer, 100, ptr );