2013-06-02 1 views
4

Je remarque qu'il existe une méthode de System.Reflection.Assembly, qui est Assembly Load(byte[] rawAssembly).Opération opposée à Assembly Load (octet [] rawAssembly)

Je me demande s'il y a une opération opposée comme byte[] Store(Assembly assembly). Si non, comment puis-je convertir un objet d'assemblage à byte[] pour appeler totalement Assembly Load(byte[] rawAssembly) en mémoire sans écrire l'assembly dans un fichier? Merci! Commentaire: La question vient du fait que j'utilise une bibliothèque tierce qui me renvoie une instance d'assemblage, et je dois utiliser la réflexion pour appeler ses méthodes. Je ne sais pas comment la bibliothèque crée cet objet d'assemblage. Je me demande simplement si je peux stocker l'objet d'assemblage à byte [] et le recharger avec 'Assembly Load (byte [] rawAssembly)'. Merci!

+0

L'ensemble vous avez à l'esprit: où est-il venu ? A-t-il été créé en mémoire (AssemblyBuilder etc)? Ou est-ce que ça vient d'un fichier? –

+0

pourquoi ne pas lire le fichier en tant que flux binaire? –

+1

Voici une question sur la poule et l'oeuf. Si vous avez un octet [] qui représente un assemblage, le stocker n'est jamais un problème. FileStream peut l'écrire dans un fichier, MemoryStream peut le stocker en mémoire. Le problème de l'œuf est d'où vient l'octet []. Le créer complètement à partir de zéro n'est pas réalisable sans l'aide significative de, disons, Reflection.Emit. Vous * utilisez * toujours un fichier si vous utilisez System.CodeDom, même si vous ne demandez que de la mémoire. –

Répondre

0

System.Reflection.Assembly implémente ISerializable. Créer une instance de BinaryFormatter et appeler sa méthode de sérialisation sur un cours d'eau - MemoryStream, FileStream, etc.

Assembly yourAssembly; 
var formatter = new BinaryFormatter(); 
var ms = new MemoryStream(); 
formatter.Serialize(ms, yourAssembly); 
var reloadedAssembly = Assembly.Load(ms.GetBuffer()); 
+0

cette chose ne fonctionne plus en C# 4.5 – ADOConnection

0

System.Security.Policy.Hash capable de calculer Hash quel que soit l'emplacement de montage. Nous avons donc au moins 2 façons d'obtenir l'assemblage en tant que tableau d'octets: 1) en utilisant la réflexion

  var hash = new Hash(assembly); 
      var dllAsArray = (byte[]) hash.GetType() 
      .GetMethod("GetRawData", BindingFlags.Instance | BindingFlags.NonPublic) 
      .Invoke(hash, new object[0]); 

2) en utilisant de faux de mise en œuvre de HashAlgoritm

public class GetWholeBodyPseudoHash : HashAlgorithm 
    { 
     protected override void Dispose(bool disposing) 
     { 
      if(disposing) _memoryStream.Dispose(); 
      base.Dispose(disposing); 
     } 

     static GetWholeBodyPseudoHash() 
     { 
      CryptoConfig.AddAlgorithm(typeof(GetWholeBodyPseudoHash), typeof(GetWholeBodyPseudoHash).FullName); 
     } 

     private MemoryStream _memoryStream=new MemoryStream(); 
     public override void Initialize() 
     { 
      _memoryStream.Dispose(); 
      _memoryStream = new MemoryStream(); 
     } 

     protected override void HashCore(byte[] array, int ibStart, int cbSize) 
     { 
      _memoryStream.Write(array, ibStart, cbSize); 
     } 

     protected override byte[] HashFinal() 
     { 
      return _memoryStream.ToArray(); 
     } 
    } 

... 

      var bytes = new Hash(yourAssembly).GenerateHash(new GetWholeBodyPseudoHash()); 
+1

Les réponses au code uniquement sont déconseillées car elles n'expliquent pas comment elles résolvent le problème dans la question. Pensez à mettre à jour votre réponse pour expliquer ce que cela fait et comment elle résout le problème. Veuillez consulter [Comment écrire une bonne réponse] (https://stackoverflow.com/help/how-to-answer) – FluffyKitten