在控制台应用程序中访问嵌入式资源

时间:2018-08-29 19:45:37

标签: c# console-application

我正在将.docx文件嵌入到我的控制台应用程序中,并且我希望能够分发console.exe并使用户能够访问其中的.docx文件。

我已将.docx文件设置为资源(参见图片)-但是,如果我尝试通过使用Resources.Test.docx“访问”它,则该文件似乎不存在,并且intellisense没有给出该文件作为选择。

我应该如何在C#控制台应用程序中执行此操作? Resource

编辑
在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'在静态属性,静态方法或静态字段初始值设定项中无效

1 个答案:

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

可以使用资源名称调用此方法,该方法将返回嵌入式资源内部的所有字节。