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
相关产品推荐
相关产品推荐

