【问题标题】:ResourceDictionary From External Assembly [read object from UnmanagedMemoryStream]来自外部程序集的 ResourceDictionary [从 UnmanagedMemoryStream 读取对象]
【发布时间】:2016-04-17 10:30:35
【问题描述】:

我在下面的代码中有一个UnmanagedMemoryStream,我如何从反序列化中获取对象。我试图从Assembly 获得Resource (rd.xaml):

string address = @"WpfControlLibrary1.dll";
Assembly skinAssembly = Assembly.LoadFrom(address);
string name = skinAssembly.GetName().Name +".g";
var manager = new ResourceManager(name, skinAssembly);
ResourceSet rs = manager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

UnmanagedMemoryStream stream = (UnmanagedMemoryStream)rs.GetObject("rd.baml", true);

我无法将deserialize 的内容Stream 转换为.net Object(在上述情况下为Resource Dictionary)。我该怎么做?

PS: BinaryFormatter 在Deserialize 操作时抛出异常。

【问题讨论】:

  • 什么异常?在哪一行?
  • {"输入流不是有效的二进制格式。起始内容(以字节为单位)为:0C-00-00-00-4D-00-53-00-42-00-41 -00-4D-00-4C-00-00 ..."}
  • 在我的代码中添加这些行: BinaryFormatter binForm = new BinaryFormatter();对象 obj = (Object)binForm.Deserialize(stream);
  • 您是否使用与反序列化相同的格式化程序对资源字典进行了序列化?看起来你正在尝试做一些奇怪的事情。 rs.GetObject 已经根据 MSDN 返回了一个 Object。然后你试图将它分配给一个流?然后反序列化?
  • 好吧,我没有按原样序列化资源,我所做的只是尝试使用反射从另一个程序集中获取它。并且 getObject 返回 UnmangedMemoryStream ...使用 ccode ...自己查看它不会返回任何其他对象。

标签: c# .net wpf reflection


【解决方案1】:

下面是我的做法,优化了代码:

public ResourceDictionary GetResourceDictionary(string assemblyName)
    {
        Assembly asm = Assembly.LoadFrom(assemblyName);
        Stream stream = asm.GetManifestResourceStream(asm.GetName().Name + ".g.resources");            
        using (ResourceReader reader = new ResourceReader(stream))
        {
            foreach (DictionaryEntry entry in reader)
            {
                var readStream = entry.Value as Stream;
                Baml2006Reader bamlReader = new Baml2006Reader(readStream);
                var loadedObject = System.Windows.Markup.XamlReader.Load(bamlReader);
                if (loadedObject is ResourceDictionary)
                {
                    return loadedObject as ResourceDictionary;
                }
            }
        }
        return null;
    }

输出:

我想从外部程序集/另一个项目中读取 ResourceDictionary,以便我可以将其迭代为 Resources 使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多