¿Es posible incrustar datos binarios (como un recurso o por algún otro medio) en el ensamblado de C # y luego leer los datos binarios del ensamblaje durante el tiempo de ejecución y escribirlos como un archivo?

Estoy haciendo una aplicación DRM y el propósito es que los datos deben estar ocultos en el ensamblaje como un recurso incrustado o un archivo ZIP protegido con contraseña. Entonces, intentaré incrustar el recurso y, si no es posible, buscaré una biblioteca ZIP / UN-ZIP con protección de contraseña para guardar datos DRM.

Estoy escribiendo un programa en C # en el que debería tener datos binarios y se agrega en el ensamblaje durante la compilación al igual que las imágenes, los íconos se agregan en el ensamblaje cuando compilamos, y luego cuando el usuario ejecuta el ensamblaje, los datos binarios son leer y guardar como un archivo externo.

¿Es posible? entonces como hacerlo?

2
Computer User 28 ene. 2015 a las 14:31

3 respuestas

La mejor respuesta

Si. Si utiliza recursos, también puede incluir archivos, que se representan como una matriz de bytes. De lo contrario, puede incluir un archivo y establecer el Build Action en Embedded Resource, que también lo incluye como un recurso, que puede leer manualmente.

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;
    }
}

Entonces úsalo así:

byte[] bytes = this.ExtractResource( Assembly.GetExecutingAssembly()
                                   , "Project.Namespace.NameOfFile.ext"
                                   );
6
Patrick Hofman 28 ene. 2015 a las 11:41

Antecedentes: cuando crea su aplicación, los datos de recursos vinculados e incrustados se compilan directamente en el ensamblaje de la aplicación (el archivo .exe o .dll).

Para acceder a los recursos, use la clase Resources contenida en Resources.Designer.cs que está anidada en el archivo Resources.resx en el Explorador de soluciones. La clase Resources encapsula todos los recursos del proyecto en propiedades get estáticas de solo lectura. Por ejemplo, Properties.Resources.Bill accede a un recurso de cadena "Bill". Puede acceder a un recurso de archivo de texto también como una propiedad string. Los archivos binarios se denominan propiedades de tipo byte[].

  1. Haga doble clic en Resources.resx. Seleccione Agregar recurso / Agregar archivo existente y desplácese hasta el archivo que desea incluir.
  2. Para los binarios, la clase Resources tiene una propiedad de tipo byte[] que lleva el nombre del archivo incluido. Suponga que el nombre del archivo es MyApp.dll, entonces la propiedad debe tener el nombre MyApp. El nombre exacto se encuentra en el archivo de código Resources.Designer.cs anidado en el archivo Resources.resx en el Explorador de soluciones.
  3. Puede acceder al recurso como Properties.Resources.MyApp. Por ejemplo, puede guardar el recurso como un archivo binario con File.WriteAllBytes(PathAndName, Properties.Resources.MyApp);.
1
Dietrich Baumgarten 2 abr. 2020 a las 19:11

Sí, es posible. Simplemente agregue el archivo en el proyecto, seleccione el archivo, vaya a la propiedad y seleccione Recurso incrustado en la propiedad Acción de compilación. Aquí está el código =

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

Para aclarar las dudas de sv88erik, como puede ver en la imagen aquí, los recursos incrustados son parte del ensamblaje en sí y tienen un nombre como NameSpace.

enter image description here

4
Rohit Prakash 28 ene. 2015 a las 11:54