2016-04-17 25 views
-2

私はUnmanagedMemoryStream以下のコードを持っています。どのようにしてオブジェクトを脱シリル化できますか?私はAssemblyからResource(rd.xaml)を取得しようとしていた。ResourceDictionary外部アセンブリから[UnmanagedMemoryStreamから読み取られたオブジェクト]

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

私は(上記の場合Resource Dictionaryです).NET ObjectStreamの内容をdeserializeすることはできませんよ。これどうやってするの?

PS:BinaryFormatterが例外をスローしている間に、Deserialize操作です。

以下
+0

例外はありますか?どの行? – cassandrad

+0

{"入力ストリームは有効なバイナリ形式ではありません。開始内容(バイト単位)は次のとおりです。0C-00-00-00-4D-00-53-00-42-00-41-00-4D-00- 4C-00-00 ... "} –

+0

これらの行をコードに追加します。BinaryFormatter binForm = new BinaryFormatter(); オブジェクトobj =(オブジェクト)binForm.Deserialize(ストリーム); –

答えて

0

は私が最適化されたコードと、それをやった方法です:

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

OUTPUT:

output

私からResourceDictionaryを読みたいと思いました外部のアセンブリ/別のプロジェクト、私はそれを反復することができますResources〜 を使用します。

関連する問題