2009-05-27 2 views
3

У меня есть часть кода, как этотПочему я получаю Stream как System.IO.UnmanagedMemoryStream?

 Assembly myAssembly = Assembly.GetExecutingAssembly(); 
     string[] names = myAssembly.GetManifestResourceNames(); 
     foreach (string file in names) 
     { 
      if (file.EndsWith(".dtd")) 
      { 
       // attach to stream to the resource in the manifest 
        dtdStream = myAssembly.GetManifestResourceStream(file); 
        MessageBox.Show(dtdStream.ToString()); 
      }     
     } 

у меня есть все ОТД файлы под моих ресурсов folder.Which имеет Тип сборки Embedded Resource.
Теперь, когда я отлаживаю код, я получаю окно с сообщением System.IO.UnmanagedMemoryStream

Но я хочу управляемый модуль памяти?
Что не так в моем коде?
0 ...

+0

Почему вы хотите поток управляемой памяти? –

ответ

8

Ресурсы собираются как часть сборки (EXE или DLL), что означает, что они загружаются в неуправляемую память, когда ОС запускает процесс. По этой причине любой поток, возвращаемый GetManifestResourceStream, должен быть неуправляемым (типа UnmanagedMemoryStream).

В чем проблема с этим, во всяком случае? Интерфейс MemoryStream и UnmanagedMemoryStream в основном идентичны, и только функциональность (скрытая) отличается, что не должно иметь для вас никакого значения.

+0

Если возможно, я могу получить поток, возвращенный GetManifestResourceStream, как управляемый? Если да, то как? –

+0

@crazy_itgal: Да, но это было бы некрасиво и не предлагало никаких преимуществ, которые я мог бы предусмотреть (и только создавать накладные расходы). (Что именно вы думаете, что это поможет?) В любом случае основным методом было бы прочитать улученный UnmanagedMemoryStream и написать все в объект MemoryStream. – Noldorin

+0

Если мне нужно прочитать изображение из потока ресурсов, мне придется использовать UnmanagedMemoryStream для инициализации BitmapImage, который принимает только параметр MemoryStream в качестве параметра конструктора. – ziyuang