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

标签 c# console-application

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

我已将 .docx 文件设置为资源(参见图片) - 但是,如果我尝试使用 Resources.Test.docx 来“访问”它,它似乎不存在,而智能感知并没有将其作为一个选项。

我应该如何在 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 -> 我收到以下错误

A local or parameter named 'args' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
Keyword 'this' is not valid in a static property, static method, or static field initializer

最佳答案

您的第一个方法,经过一些修改,应该能够返回资源流。这基本上是您稍微修改一下以读取流的内容:

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

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

关于c# - 在控制台应用程序中访问嵌入式资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085044/

相关文章:

c# - VS2015 中的自动完成 "Committed by typing the following characters"选项在哪里?

c# - 在 C# 中为 jQuery 创建 XML

c# - 使用委托(delegate)作为参数

.net - VB.Net 'Sub Main' 未找到

php - "X"参数不存在

php - php 和 (exe) C++ 控制台应用程序之间的通信

console-application - 您如何在 .net 核心控制台应用程序中存储用户应用程序数据

c# - tabControl 中选项卡的初始化

c# - Azure 连接字符串 - 对象引用未设置为对象的实例

c# - 在 Sharpdevelop 3.x 中使用 AvalonEdit