class Foo
{
static bool Bar(Stream^ stream);
};
class FooWrapper
{
bool Bar(LPCWSTR szUnicodeString)
{
return Foo::Bar(??);
}
};
MemoryStream примет byte[], но я бы подобно сделал это без копирования данных, если это возможно.





Если бы мне пришлось скопировать память, думаю, сработало бы следующее:
static Stream^ UnicodeStringToStream(LPCWSTR szUnicodeString)
{
//validate the input parameter
if (szUnicodeString == NULL)
{
return nullptr;
}
//get the length of the string
size_t lengthInWChars = wcslen(szUnicodeString);
size_t lengthInBytes = lengthInWChars * sizeof(wchar_t);
//allocate the .Net byte array
array^ byteArray = gcnew array(lengthInBytes);
//copy the unmanaged memory into the byte array
Marshal::Copy((IntPtr)(void*)szUnicodeString, byteArray, 0, lengthInBytes);
//create a memory stream from the byte array
return gcnew MemoryStream(byteArray);
}Вы можете избежать копирования, если вместо этого используете UnmanagedMemoryStream() (класс существует в .NET FCL 2.0 и более поздних версиях). Как и MemoryStream, он является подклассом IO.Stream и имеет все обычные потоковые операции.
Описание этого класса Microsoft:
Provides access to unmanaged blocks of memory from managed code.
что в значительной степени говорит вам то, что вам нужно знать. Обратите внимание, что UnmanagedMemoryStream() не соответствует требованиям CLS.
Примечание: этот ответ работает только в небезопасном коде. Если вы не компилируете с флагом небезопасности, возможно, вам повезет больше, если вы поместите данные в байтовый массив, а затем обернете этот байтовый массив в поток. См. Здесь: stackoverflow.com/a/11660831/684852 Однако вам необходимо знать длину данных (количество байтов в исходной строке Unicode на указателе). Например:
byte[] dataArray = new byte[dataLength]; Marshal.Copy(szUnicodeString, dataArray, 0, dataLength); MemoryStream stream = new MemoryStream(dataArray);