【问题标题】:Why am i getting Stream as System.IO.UnmanagedMemoryStream?为什么我将 Stream 作为 System.IO.UnmanagedMemoryStream?
【发布时间】:2009-05-27 19:32:19
【问题描述】:

我有一段这样的代码

        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());
            }                
        }

我的 Resources 文件夹下有所有 dtd 文件。它的构建类型为 Embedded Resource。
现在,当我调试代码时,我收到一个消息框,显示 System.IO.UnmanagedMemoryStream

但我想要一个托管的 MemoryStream?
我的代码有什么问题?
谢谢...

【问题讨论】:

  • 为什么需要托管内存流?

标签: c# resources assemblies stream


【解决方案1】:

资源作为程序集(EXE 或 DLL)的一部分进行编译,这意味着当操作系统启动进程时它们会被加载到非托管内存中。这就是GetManifestResourceStream 返回的任何流必须是非托管UnmanagedMemoryStream 类型)的原因。

这到底有什么问题? MemoryStreamUnmanagedMemoryStream的界面基本相同,只是(隐藏的)功能不同,对你应该没有什么影响。

【讨论】:

  • 如果可能的话,我能否将 GetManifestResourceStream 返回的流作为托管?如果是,那怎么办?
  • @crazy_itgal:是的,但它不会很漂亮,并且不会提供我可以想象的任何优势(并且只会产生开销)。 (你认为它到底有什么帮助?)无论如何,基本方法是读取整个 UnmanagedMemoryStream 并将所有内容写入 MemoryStream 对象。
  • 如果我需要从资源流中读取图像,我将不得不使用UnmanagedMemoryStream来初始化BitmapImage,它只接受MemoryStream作为构造函数的参数。
【解决方案2】:

这是“设计使然”的行为,提供更快的内存访问。

参考:http://msdn2.microsoft.com/en-us/library/system.reflection.emit.modulebuilder.definemanifestresource(VS.85).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2023-03-25
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多