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

Is it possible to embed binary data in a .NET assembly

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

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

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

可能吗?那怎么办呢?

是的。如果您使用 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"
                                   );

是的,有可能。只需在项目中添加文件,Select 文件,Go to 属性 and select Embedded Resource in Build Action 属性。 这是代码=

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

For clarification of sv88erik doubts- as you can see in picture here, embedded resources are a part of the assembly itself and having a name as NameSpace.FileName

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

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

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