是否可以在.NET程序集中嵌入二进制数据

时间:2015-01-28 11:31:55

标签: c# .net embedded-resource dotnetzip

是否可以在C#程序集中嵌入二进制数据(作为资源或其他方法),然后在运行时从程序集中读取二进制数据并将其写为文件。

我正在制作DRM应用程序,目的是数据必须作为嵌入式资源或受密码保护的ZIP文件隐藏在程序集中。因此,我将尝试嵌入资源,如果不可能,那么将寻找具有密码保护的ZIP / UN-ZIP库以保存DRM数据。

我正在用C#编写一个程序,其中应该有一个二进制数据,它在编译期间在程序集中添加就像图像一样,在编译时在程序集中添加图标,然后当用户执行程序集时读取二进制数据并将其另存为外部文件。

有可能吗?怎么做呢?

3 个答案:

答案 0 :(得分: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"
                                   );

答案 1 :(得分:3)

是的,它可能。只需在项目中添加文件,选择文件,转到属性,然后在Build Action属性中选择Embedded Resource。 这是代码=

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

澄清sv88erik疑虑 -   正如您在此处所见,嵌入式资源是程序集本身的一部分,名称为NameSpace.FileName

enter image description here

答案 2 :(得分:1)

背景:构建应用程序时,链接和嵌入的资源数据直接编译到应用程序程序集(.exe或.dll文件)中。

要访问资源,请使用Resources.Designer.cs中包含的类Resources,该类嵌套在解决方案资源管理器中的Resources.resx文件下。 Resources类将所有项目资源封装到静态的readonly get属性中。例如,Properties.Resources.Bill访问字符串资源“ Bill”。您也可以作为string属性来访问文本文件资源。二进制文件被称为类型byte[]的属性。

  1. 双击Resources.resx。选择添加资源/添加现有文件,然后滚动到要包含的文件。
  2. 对于二进制文件,资源类具有类型byte[]的属性,该属性以包含的文件命名。假设文件名为MyApp.dll,则该属性应具有名称MyApp。您可以在嵌套在解决方案资源管理器中Resources.resx文件下的代码文件Resources.Designer.cs中找到确切的名称。
  3. 您可以以Properties.Resources.MyApp的身份访问资源。例如,您可以使用File.WriteAllBytes(PathAndName, Properties.Resources.MyApp);将资源另存为二进制文件。