我正在将.docx文件嵌入到我的控制台应用程序中,并且我希望能够分发console.exe并使用户能够访问其中的.docx文件。
我已将.docx文件设置为资源(参见图片)-但是,如果我尝试通过使用Resources.Test.docx
“访问”它,则该文件似乎不存在,并且intellisense没有给出该文件作为选择。
编辑
在winforms中,我将这样嵌入资源:
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string rn1 = new AssemblyName(args.Name).Name + ".docx";
string rs1 = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(rn1));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(rs1))
{
Byte[] assemblydata = new Byte[stream.Length];
stream.Read(assemblydata, 0, assemblydata.Length);
return Assembly.Load(assemblydata);
}
}
}
并像这样访问文件:
Object oFName;
byte[] resourceFile = Properties.Resources.Report;
string destination = Path.Combine(Path.GetTempPath(), "Test.docx");
System.IO.File.WriteAllBytes(destination, resourceFile);
oFName = destination;
编辑2
如果我尝试使用用于winforms的代码,则AppDomain.CurrentDomain.AssemblyResolve->
我收到以下错误
不能在此范围内声明名为“ args”的本地或参数,因为该名称在封闭的本地范围内用于定义本地或参数
关键字'this'在静态属性,静态方法或静态字段初始值设定项中无效
答案 0 :(得分:2)
您的第一个方法,经过一些修改,应该能够返回资源流。基本上,这是您为了读取流而进行的一些修改:
public static byte[] GetResourceData(string resourceName)
{
var embeddedResource = Assembly.GetExecutingAssembly().GetManifestResourceNames().FirstOrDefault(s => string.Compare(s, resourceName, true) == 0);
if (!string.IsNullOrWhiteSpace(embeddedResource))
{
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResource))
{
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
return null;
}
可以使用资源名称调用此方法,该方法将返回嵌入式资源内部的所有字节。