You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetManifestResourceStream是否要求资源在Resources中?根目录资源及方案安全问询

关于GetManifestResourceStream()的资源位置与名称问题

嗨,这个问题我之前踩过坑,咱们一步步理清楚:

首先明确:调用GetManifestResourceStream()的文件完全不需要放在Resources文件夹里,只要你把文件的「生成操作」设置为Embedded Resource,不管放在项目的哪个目录(包括根目录),理论上都能被找到——你现在返回Nothing,大概率是因为用错了资源名称。

为什么名称会错?因为嵌入资源的名称不是简单的文件名,它的构成和项目的默认命名空间、文件所在路径直接相关:

  • 如果文件在项目根目录,默认的资源名称格式是「项目默认命名空间.文件名」。比如你的项目默认命名空间是MyCompany.MyTool,文件是vbaProject.bin,那正确的资源名称就是MyCompany.MyTool.vbaProject.bin
  • 如果文件在子文件夹里,名称会自动加上文件夹路径(用点代替斜杠),比如放在Resources文件夹下的话,名称就是MyCompany.MyTool.Resources.vbaProject.bin

快速定位正确资源名称的小技巧

最稳妥的方式是直接枚举当前程序集里所有的嵌入资源,看你的文件对应的完整名称到底是什么,代码如下:

using System.Reflection;

// 获取当前运行的程序集
var currentAssembly = Assembly.GetExecutingAssembly();
// 遍历并打印所有嵌入资源的名称
foreach (var resourceName in currentAssembly.GetManifestResourceNames())
{
    Console.WriteLine(resourceName);
}

运行这段代码后,你就能在控制台输出里找到vbaProject.bin对应的那条记录,直接用这个完整名称调用GetManifestResourceStream(),问题就能解决。


关于安全问题的解答

你提到按照Michael的建议操作后担心安全性——放心,这个方案非常安全:

  • Assembly.GetManifestResourceNames()是.NET官方提供的标准API,专门用来枚举程序集内的嵌入资源,不存在任何安全隐患
  • 这种方式还能避免硬编码资源名称带来的潜在问题(比如后续修改项目命名空间、调整文件路径后,硬编码的名称会失效),反而让你的代码更健壮、更易维护

内容的提问来源于stack exchange,提问作者Maury Markowitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:10:46