代码之家  ›  专栏  ›  技术社区  ›  Shiva

有没有在C#中使用反射从程序集读取文本文件的方法?

  •  1
  • Shiva  · 技术社区  · 15 年前

    Stream stream = Assembly.GetAssembly(typeof(MyClass)).GetFile("data");
    

    protected Stream GetLogoImageStream()
           {
    
               Assembly current = Assembly.GetExecutingAssembly();
               string imageFileNameFormat = "{0}.{1}";
              string imageName = "myLogo.GIF";
    
               string assemblyName = current.ManifestModule.Name;
               int extensionIndex = assemblyName.LastIndexOf(".dll", StringComparison.CurrentCultureIgnoreCase);
               string file = string.Format(imageFileNameFormat, assemblyName.Remove(extensionIndex, 4), imageName);            
               Stream thisImageStream = current.GetManifestResourceStream(file);
               return thisImageStream;
    
           }
    

    但是,当从正在执行的程序集读取.txt文件时,这种方法不起作用。如果有人能告诉我从程序集中读取.txt文件的方法,我将不胜感激。请不要问我为什么不从驱动器或网络共享读取文件。只需说要求从程序集中读取.txt文件。

    非常感谢

    3 回复  |  直到 15 年前
        1
  •  3
  •   Christian Hayter    15 年前

    GetManifestResourceStream 确实是读取数据的正确方法。但是,当它回来的时候 null

    • 这个VB.NET版编译器生成的资源名为 <root namespace>.<physical filename> .
    • C编译器生成一个 <default namespace>.<folder location>.<physical filename> ,在哪里 <folder location>

    你可以打电话给 Assembly.GetManifestResourceNames 方法来检查编译器生成的实际名称。

        2
  •  0
  •   driis    15 年前

    文件 变量,该变量具有存储在程序集中的资源的实际名称(可以使用 Reflector

        3
  •  0
  •   Shiva    15 年前

    我非常感谢大家在这个问题上的帮助。我可以用这样的代码读取文件:

    Assembly a = Assembly.GetExecutingAssembly();
                string[] nameList = a.GetManifestResourceNames();
                string manifestanme = string.Empty;
                if (nameList != null && nameList.Length > 0)
                {
                    foreach (string name in nameList)
                    {
                        if (name.IndexOf("c.txt") != -1)
                        {
                            manifestanme = name;
                            break;
                        }
                    }
                }
    
                Stream stream = a.GetManifestResourceStream(manifestanme);
    

    感谢并+1感谢Christian Hayter提供这个方法:a.GetManifestResourceNames();