【问题标题】:Read a Resourse file using Assembly GetManifestResourceStream method using C#使用 C# 使用 Assembly GetManifestResourceStream 方法读取资源文件
【发布时间】:2017-03-07 08:37:15
【问题描述】:

我在项目的根文件夹下有一个证书。项目名称是 SingleSignOn,但我无法使用 GetManifestResourceStream 内置方法读取该方法。

源代码是

namespace SingleSignOn
{
    public class Program
    {
        static void Main(string[] args)
         {
            var assembly = typeof(Program).Assembly;
            var super = assembly.GetManifestResourceNames();
            using (var stream = assembly.GetManifestResourceStream("SingleSignOn.idsrv3test.pfx"))
            {

            }
        }
    }
}

解决方案资源管理器快照

我从所说的内置方法GetManifestResourceStream得到NULL

我不知道我错过了什么。该证书的 URL 是https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Certificates/idsrv3test.pfx

请帮助我如何阅读证书。

【问题讨论】:

  • 右键pfx文件->属性->构建动作,将其设为“嵌入式资源”
  • 你为什么要读那把钥匙? .net 签名会自动完成。
  • 该程序集的默认命名空间是什么(项目属性中的命名空间)?因为那是 GetManifestResourceStream 用来定位资源的。
  • 正确猜测程序集和资源流名称通常是一件危险的事情。这就是为什么您可以使用 Project > Properties > Resources 来避免编写这样的代码的原因。您可以使用 ildasm.exe 等反编译器仔细检查流名称。双击清单以查看 .mresource 名称。
  • @HansPassant 不是资源名称总是 DefaultNamespace.Folder.SubFolder.File?

标签: c# .net ssl resources .net-assembly


【解决方案1】:

试试这个:

var resourceName = "SingleSignOn.idsrv3test.pfx";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
  TextReader tr = new StreamReader(stream);
  string fileContents = tr.ReadToEnd();
}

注意:将文件作为嵌入资源。文件 > 右键单击​​ > 属性 > 构建操作 > 选择嵌入资源。

【讨论】:

  • 获取执行程序集的速度非常慢
【解决方案2】:

确保文件是“嵌入式资源”。 Right click the pfx file -> Properties -> Build Action,设为“嵌入式资源”

【讨论】:

    【解决方案3】:

    我个人的方法是为 Assembly 类编写一个扩展,因为这似乎是一个无论如何都应该包含在该类中的方法。

    因此,正如其他发帖者所提到的,首先确保您的文本文件被标记为“嵌入式资源”,然后使用类似于以下的代码:

    public static class Extensions
    {
        public static string ReadTextResource(this Assembly asm, string resName)
        {
            string text;
            using (Stream strm = asm.GetManifestResourceStream(resName))
            {
                using (StreamReader sr = new StreamReader(strm))
                {
                    text = sr.ReadToEnd();
                }
            }
            return text;
        }
    }
    

    (上面的代码可以更简洁,但我是为了演示而使用的)

    【讨论】:

      【解决方案4】:

      解决方案 2

      第 1 步:更改 .PFX 文件的属性 idsrv3test.pfx 属性,将 Build action 设置为 Embedded Resource

      第 2 步:代码更改:

      var resourceName = "SingleSignOn.idsrv3test.pfx";
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
      {
        TextReader tr = new StreamReader(stream);
        string fileContents = tr.ReadToEnd();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 2014-01-28
        • 1970-01-01
        • 2013-05-19
        • 2015-07-12
        • 1970-01-01
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多