对嵌入式资源的强类型访问

时间:2012-11-14 16:56:48

标签: c# visual-studio-2010 embedded-resource

我试图建立对我在类库中创建的嵌入式SQL资源文件的访问权限。但是,我不知道从哪里开始。

我使用以下方式访问了资源:

Assembly.GetExcecutingAssembly().GetManifestResourceStream("InsertTest.sql");

我的理解是有一种方式可以以强类型的方式访问它们,但我似乎无法处理项目或解决方案,以编程方式浏览各自的属性或资源。

我错过了什么?

3 个答案:

答案 0 :(得分:7)

虽然我确实得到了一些很好的建议(参见菲利普丹尼尔斯的回答 - 很好的东西),但他们都没有真正解决我的具体问题。但是,我发现最简单的方法是执行以下操作:

  1. 右键单击您的项目,然后选择“属性”
  2. 选择“资源”标签。如有必要,请创建新的资源文件。
  3. 在左上角有一个默认为'Strings'的下拉列表。单击此框并选择“文件”。
  4. 拖放您要嵌入项目的资源文件。
  5. 您现在可以使用以下语法访问强类型资源:

    Project.Properties.Resources.ResourceName;
    

    在我的情况下,这完全正常,因为我在这些文件中存储内联SQL,它返回嵌入在文件中的sql。但请注意,默认情况下,这些资源是 已链接 而未嵌入,但您可以更改其属性以将其设置为嵌入。

    希望这有助于某人!

答案 1 :(得分:1)

你快到了。我有几个功能用于此。你可以为图像做一些非常相似的事情。我不确定是否值得创建您想要的属性(如果您坚持,可以通过项目属性的“资源”选项卡执行此操作)。

/// <summary>
    /// Gets an open stream on the specified embedded resource. It is the
    /// caller's responsibility to call Dispose() on the stream.
    /// The filename is of the format "folder.folder.filename.ext"
    /// and is case sensitive.
    /// </summary>
    /// <param name="assembly">The assembly from which to retrieve the Stream.</param>
    /// <param name="filename">Filename whose contents you want.</param>
    /// <returns>Stream object.</returns>
    public static Stream GetStream(Assembly assembly, string filename)
    {
        string name = String.Concat(assembly.GetName().Name, ".", filename);
        Stream s = assembly.GetManifestResourceStream(name);
        return s;
    }

    /// <summary>
    /// Get the contents of an embedded file as a string.
    /// The filename is of the format "folder.folder.filename.ext"
    /// and is case sensitive.
    /// </summary>
    /// <param name="assembly">The assembly from which to retrieve the file.</param>
    /// <param name="filename">Filename whose contents you want.</param>
    /// <returns>String object.</returns>
    public static string GetFileAsString(Assembly assembly, string filename)
    {
        using (Stream s = GetStream(assembly, filename))
        using (StreamReader sr = new StreamReader(s))
        {
            string fileContents = sr.ReadToEnd();
            return fileContents;
        }
    }

答案 2 :(得分:1)

在资源文件中,您无法使用智能感知来构建您的sql脚本,并将它们作为项目中的单独文件进行比较。您可以创建一个帮助程序类,以强类型方式访问它们:

public class Scripts
{
    public static string Sql1
    {
        get
        {
            return GetResource("sql1.sql");
        }
    }

   public static string Sql2
   {
        get
        {
           return GetResource("sql2.sql");
        }
   }

    private static string GetResource(string name)
    {
        var assembly = Assembly.GetExecutingAssembly();
        using(var stream = new StreamReader(assembly.GetManifestResourceStream("Myproject.Sql." + name)))
        {
            return stream.ReadToEnd();
        }
    }
}

例如,在Dapper中,您可以像这样访问脚本:

using(var db = new SqlConnection("yourconnectionstring")){
    db.Open();
    var results = db.Query(Scripts.Sql1);
}