2009-03-23 12 views
5

Mon scénario - J'essaie d'envoyer un fichier d'assemblage du serveur au client (via une connexion TCP directe). Mais le problème majeur est: comment puis-je convertir cet assemblage en octets pour qu'il puisse être facilement transféré? I utilisé suivant -Assembly to Bytes

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

Mais quand je l'utilise -

Assembly assembly = Assembly.Load(dllAsArray); 

je reçois une exception -

Impossible de charger le fichier ou l'assembly « 165 octets chargés du code serveur générateur, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null 'ou l'une de ses dépendances. Une tentative de chargement d'un programme avec un format incorrect a été effectuée. S'il vous plaît aider !!!

Répondre

6

Ne serait-ce pas le contenu de la DLL brute, comme si vous l'aviez enregistré sur le disque? c'est-à-dire l'équivalent de File.ReadAllBytes?

Il semble que la DLL est générée - pouvez-vous l'enregistrer n'importe où? (zone temp, flux de mémoire, etc.)?

modifier Comme il semble que vous utilisez-dom code, essayez d'utiliser PathToAssembly (sur le compilateur résultats) et File.ReadAllBytes (ou un mécanisme de diffusion en continu similaire).

4

Chargez simplement le fichier via ReadAllBytes et écrivez via WriteAllBytes. L'octet [] pourrait être transféré sur le réseau.

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

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

modifier: Si vous utilisez un AssemblyBuilder pour créer votre dll, vous pouvez utiliser .Save (fileName) pour vous il persister à HardDrive avant.

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