无法找到类型或命名空间‘Assembly’,如何获取嵌入资源访问引用?
解决“类型或命名空间‘Assembly’无法找到”及嵌入资源访问问题
这个问题我之前处理.NET嵌入资源时也碰到过,核心原因要么是缺少必要的命名空间引用,要么是后续可能遇到的嵌入资源名称配置错误,咱们一步步来搞定:
第一步:解决Assembly找不到的错误
Assembly和GetTypeInfo类型都属于System.Reflection命名空间,你只需要在代码文件的最顶部添加这个using指令:
using System.Reflection;
如果你用的是.NET Framework(非.NET Core/.NET 5+),也可以直接简化成Assembly assembly = Assembly.GetExecutingAssembly();,不过你当前的写法在新框架里完全兼容,只要加了上面的using就没问题。
第二步:确保嵌入资源的名称正确
你代码里的"Documents.Huckleberry.Txt"大概率有格式问题,嵌入资源的名称规则是**[你的项目程序集名称].[资源所在的文件夹层级].[文件名]**,而且是严格区分大小写的!
举个实际例子:
- 如果你的项目名称是
MyBookReader - 资源文件放在项目根目录的
Documents文件夹里,文件名叫Huckleberry.txt - 那正确的资源名应该是
MyBookReader.Documents.Huckleberry.txt
排查资源名称的小技巧
可以在代码里加一段调试代码,打印出所有嵌入资源的名称,这样就能精准找到你要的那个:
Assembly assembly = typeof(YourCurrentClass).GetTypeInfo().Assembly; // 打印所有嵌入资源名称 foreach (var resName in assembly.GetManifestResourceNames()) { Console.WriteLine(resName); }
把YourCurrentClass替换成你当前写这段代码的类名就行。
第三步:确认资源的生成操作设置
在Visual Studio里右键你的Huckleberry.txt文件→属性,把「生成操作」设置为嵌入的资源,这一步很容易遗漏,一定要检查!
修正后的完整代码示例
using System.Reflection; using System.IO; public class BookLoader { public void LoadHuckleberryText() { // 用typeof代替GetType()更稳妥,避免子类继承时的Assembly偏差 Assembly assembly = typeof(BookLoader).GetTypeInfo().Assembly; // 替换成你实际的资源名称(从调试输出里复制) string resourceName = "MyBookReader.Documents.Huckleberry.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { // 加个判断,避免资源找不到时出现空引用异常 if (stream == null) { throw new InvalidOperationException($"找不到嵌入资源:{resourceName},请检查资源名称和生成操作设置"); } using (StreamReader reader = new StreamReader(stream)) { bool gotTitle = false; string line; while ((line = reader.ReadLine()) != null) { if (!gotTitle) { // 处理标题行逻辑 Console.WriteLine($"标题:{line}"); gotTitle = true; } else { // 处理正文内容 Console.WriteLine(line); } } } } } }
内容的提问来源于stack exchange,提问作者Brandon Lukowski
相关产品推荐
相关产品推荐

