2017-02-20 9 views
-1

Application написать некоторые данные в исполняемый файл B так Исполняемые B может получить доступ к этой информацииC#: запись/чтение другой исполняемый файл ресурса

Как писать/читать ресурс на другой исполняемый файл.

Просто основной ответ

Я нашел фрагмент кода для записи ресурса в приложении, и это работает, но я не могу retrive данные:

public class Packer : IDisposable 
{ 
    private static byte[] MAGIC_NUMBER = { 0x44, 0x61, 0x6c, 0x65, 0x6b, 0x4c, 0x75, 0x63 }; 

    private Stream inStream; 

    public Packer(string filename, bool openReadonly = false) 
    { 
     inStream = File.Open(filename, FileMode.Open, openReadonly ? FileAccess.Read : FileAccess.ReadWrite, openReadonly ? FileShare.Read : FileShare.None); 
    } 

    public byte[] ReadData(int index) 
    { 
     byte[] mn_buf = new byte[MAGIC_NUMBER.Length]; 
     byte[] len_buf = new byte[sizeof(Int32)]; 
     int data_len = 0; 
     inStream.Seek(0, SeekOrigin.End); 
     for (int i = 0; i <= index; ++i) 
     { 
      inStream.Seek(-MAGIC_NUMBER.Length, SeekOrigin.Current); 
      inStream.Read(mn_buf, 0, MAGIC_NUMBER.Length); 
      inStream.Seek(-MAGIC_NUMBER.Length, SeekOrigin.Current); 
      for (int j = 0; j < MAGIC_NUMBER.Length; ++j) 
      { 
       if (mn_buf[j] != MAGIC_NUMBER[j]) 
       { 
        throw new IndexOutOfRangeException("Not enough data."); 
       } 
      } 
      inStream.Seek(-sizeof(Int32), SeekOrigin.Current); 
      inStream.Read(len_buf, 0, sizeof(Int32)); 
      inStream.Seek(-sizeof(Int32), SeekOrigin.Current); 
      data_len = BitConverter.ToInt32(len_buf, 0); 
      inStream.Seek(-data_len, SeekOrigin.Current); 
     } 
     byte[] data = new byte[data_len]; 
     inStream.Read(data, 0, data_len); 
     return data; 
    } 

    public void AddData(byte[] data) 
    { 
     inStream.Seek(0, SeekOrigin.End); 
     inStream.Write(data, 0, data.Length); 
     inStream.Write(BitConverter.GetBytes(data.Length), 0, sizeof(Int32)); 
     inStream.Write(MAGIC_NUMBER, 0, MAGIC_NUMBER.Length); 
    } 

    public void Dispose() 
    { 
     inStream.Dispose(); 
    } 
} 

(я не знаю, как его уменьшить)

Спасибо!

+0

Хотя ваш вопрос слишком широк, но в качестве намека типичный подход заключается в том, чтобы хранить промежуточные данные (то, что производится A и должно использоваться B) в общем хранилище, и получать к нему доступ оттуда. – mok

ответ

1

Вы можете прочитать ресурсы из любого узла по

  1. Получить ссылку на сборку с помощью отражения

  2. Передайте узел в качестве аргумента конструктора к новому ResourceManager.

Пример:

var asm = System.Reflection.Assembly.LoadFrom("External.Resources.exe"); 
var manifests = asm.GetManifestResourceNames(); 

foreach (var s in manifests) 
{ 
    var rm = new ResourceManager(s, asm); 
    var rs = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true); 
    foreach (DictionaryEntry r in rs) 
    { 
     Console.WriteLine(String.Format("Key: {0}\tValue:{1}", r, r.Key, r.Value); 
    } 
} 

Письменные ресурсы - это другое дело. Если ресурс включен в сборку, это означает, что он был скомпилирован. Если ваш код не способен компилировать ресурсы, невозможно внедрить ресурсы во внешнюю сборку.

Вы могли собрать ресурсы для третьего файла (с расширением .resource.) с помощью ResGen.exe (вы должны порождать отдельный процесс), но вам все равно нужно будет скомпилировать проект, чтобы получить ресурсы впрыскивается в сборку.

Если вы пытаетесь обновить исходную сборку, вы можете запустить новый процесс, запущенный ilasm.exe, с помощью переключателя /resource (который теоретически вставляет файл .res в сборку). Вам нужно будет создать довольно сложный рабочий процесс, чтобы сгенерировать файл .res, получить его в сборную сборку и заменить исходную сборку, а если сборка будет подписана, вам также понадобится секретный ключ.

Смежные вопросы