是否可以在C#程序集中嵌入二进制数据(作为资源或其他方法),然后在运行时从程序集中读取二进制数据并将其写为文件。
我正在制作DRM应用程序,目的是数据必须作为嵌入式资源或受密码保护的ZIP文件隐藏在程序集中。因此,我将尝试嵌入资源,如果不可能,那么将寻找具有密码保护的ZIP / UN-ZIP库以保存DRM数据。
我正在用C#编写一个程序,其中应该有一个二进制数据,它在编译期间在程序集中添加就像图像一样,在编译时在程序集中添加图标,然后当用户执行程序集时读取二进制数据并将其另存为外部文件。
有可能吗?怎么做呢?
答案 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)
private Stream GetStream(string fileName)
{
var asm = Assembly.GetExecutingAssembly();
Stream stream = asm.GetManifestResourceStream("NameSpace." + fileName);
return stream;
}
澄清sv88erik疑虑 - 正如您在此处所见,嵌入式资源是程序集本身的一部分,名称为NameSpace.FileName
答案 2 :(得分:1)
背景:构建应用程序时,链接和嵌入的资源数据直接编译到应用程序程序集(.exe或.dll文件)中。
要访问资源,请使用Resources.Designer.cs中包含的类Resources
,该类嵌套在解决方案资源管理器中的Resources.resx文件下。 Resources类将所有项目资源封装到静态的readonly get属性中。例如,Properties.Resources.Bill
访问字符串资源“ Bill”。您也可以作为string
属性来访问文本文件资源。二进制文件被称为类型byte[]
的属性。
byte[]
的属性,该属性以包含的文件命名。假设文件名为MyApp.dll,则该属性应具有名称MyApp
。您可以在嵌套在解决方案资源管理器中Resources.resx文件下的代码文件Resources.Designer.cs中找到确切的名称。Properties.Resources.MyApp
的身份访问资源。例如,您可以使用File.WriteAllBytes(PathAndName, Properties.Resources.MyApp);
将资源另存为二进制文件。