2009-03-23 11 views
5

Mój scenariusz - Próbuję wysłać plik złożenia z serwera do klienta (przez bezpośrednie połączenie TCP). Ale głównym problemem jest: w jaki sposób mogę przekonwertować to zgromadzenie na bajty, aby można je było łatwo przenieść? Użyłem następujący -Montaż do bajtów

byte[] dllAsArray; 
using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream,loCompiled.CompiledAssembly); 
    dllAsArray = stream.ToArray(); 
} 

Ale gdy używam -

Assembly assembly = Assembly.Load(dllAsArray); 

uzyskać wyjątek -

Nie można załadować pliku lub zestawu „165 bajtów załadowanych z kodu serwera generatora, Wersja = 1.0.0.0, Culture = neutral, PublicKeyToken = null 'lub jedna z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie. Proszę pomóż !!!

Odpowiedz

6

Czy to nie byłby po prostu surowy plik dll, jak gdyby zapisałeś go na dysku? tj. odpowiednik File.ReadAllBytes?

To brzmi jak wygenerowana biblioteka dll - czy możesz ją zapisać w dowolnym miejscu? (obszar tymczasowy, strumień pamięci, itp.)?

edit Ponieważ wydaje używasz kodu-dom, spróbuj użyć PathToAssembly (na kompilator wyników) i File.ReadAllBytes (lub podobny mechanizm strumieniowego).

4

Wystarczy załadować plik przez ReadAllBytes i napisać przez WriteAllBytes. Bajt [] może zostać przesłany przez sieć.

// Transfer to byte[] 
byte[] data = System.IO.File.ReadAllBytes(@"C:\ClassLibaryOne.dll"); 

// Write to file again 
File.WriteAllBytes(@"C:\ClassLibaryOne.dll", data); 

edit: Jeśli używasz AssemblyBuilder tworzyć biblioteki DLL, można użyć .save (filename), aby utrzymywać go na twardy dysk przed ty.

AssemblyBuilder a = ... 
a.Save("C:\ClassLibaryTwo.dll);