2015-01-28 2 views
2

Возможно ли встраивание двоичных данных (как ресурса или какого-либо другого значения) в сборку C#, а затем чтение двоичных данных из сборки во время выполнения и напишите его как файл.Возможно ли встраивать двоичные данные в сборку .NET

Я делаю приложение DRM и цель заключается в том, что данные должны быть скрыты в сборке в виде встроенного ресурса или защищенного паролем ZIP-файла. Итак, я попытаюсь внедрить этот ресурс, и если это невозможно, он будет искать ZIP/UN-ZIP-библиотеку с защитой паролем для сохранения данных DRM.

Я пишу программу на C#, в которой должны быть бинарные данные, и она добавляется в сборку во время компиляции, как изображения, значки добавляются в сборку при компиляции, а затем, когда сборка выполняется пользователем, тогда двоичные данные считываются и сохраняются как внешний файл.

Возможно ли это? то как это сделать?

ответ

5

Да. Если вы используете resources, вы можете также включить файлы, которые представлены в виде массива байтов. Кроме того, вы можете включить файл и установить Build Action на Embedded Resource, которые включают его как ресурс, который вы можете прочитать вручную.

public byte[] ExtractResource(Assembly assembly, string resourceName) 
{ 
    if (assembly == null) 
    { 
     return null; 
    } 

    using (Stream resFilestream = assembly.GetManifestResourceStream(resourceName)) 
    { 
     if (resFilestream == null) 
     { 
      return null; 
     } 

     byte[] bytes = new byte[resFilestream.Length]; 
     resFilestream.Read(bytes, 0, bytes.Length); 

     return bytes; 
    } 
} 

Затем использовать его как это:

byte[] bytes = this.ExtractResource(Assembly.GetExecutingAssembly() 
            , "Project.Namespace.NameOfFile.ext" 
            ); 
3

да, его можно. Просто добавьте файл в проект, выберите файл, перейдите в свойство и выберите Embedded Resource в свойстве Build Action. Вот код =

private Stream GetStream(string fileName) 
    { 
     var asm = Assembly.GetExecutingAssembly(); 
     Stream stream = asm.GetManifestResourceStream("NameSpace." + fileName); 
     return stream; 
    } 

Для осветления sv88erik doubts- , как вы можете видеть на картинке здесь, встроенные ресурсы являются частью самой сборки и имеющий имя, как NameSpace.FileName

enter image description here

+0

Rohit Prakash: ЕСЛИ вы удаляете жестко обозначенное пространство имен, вы получаете +1 от меня. Не хорошая практика! – sv88erik

+1

@ sv88erik: Он не должен. Это необходимо ... –

+0

Дайте мне повод, почему он не должен быть динамическим :)? System.Reflection.Assembly.GetExecutingAssembly(). EntryPoint.DeclaringType.Namespace – sv88erik

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