从程序集中读取嵌入式资源
我们有时会将一些文件当作资源嵌入到程序集中。比如,嵌入图标等。当程序集加载后,如果从程序集中读取这些嵌入式资源呢?Assembly类有一个GetManifestResourceStream方法,可创建一个读取资源的Stream,有了Stream后,一切就好办了。下面的程序演示如果读取嵌入式资源。
Code
/**//// <summary>
/// Extract the specified file from the assembly and save it to the path specified.
/// The exceptions thrown by IO operations are not caught.
/// </summary>
/// <param name="filePath">The file path in the assembly. Generally, the path is formed like: $DefaultNamepace.$Directorys.FileName</param>
/// <param name="targetFullPath">Full path of the target file.</param>
internal void ExtractFileFromAssembly(string filePath, string targetFullPath)
{
Type type = this.GetType();
Stream stream = type.Assembly.GetManifestResourceStream(filePath);
using (FileStream fs = new FileStream(Environment.ExpandEnvironmentVariables(targetFullPath)
, FileMode.OpenOrCreate
, FileAccess.Write
, FileShare.None))
{
byte[] bytes = new byte[1024];
int byteRead = stream.Read(bytes, 0, 1024);
while (byteRead > 0)
{
fs.Write(bytes, 0, byteRead);
byteRead = stream.Read(bytes, 0, 1024);
}
}
}
这里需要一个资源路径的参数,资源路径的构造如下:
程序集的默认命名空间. + 目录路径. + 文件名(带扩展名)
如果获得程序集的默认命名空间?
在工程节点上点击右键 -> 属性,在Application标签页可以看到默认命名空间。
我的示例工程,读取的图片的资源路径是:
MigrationTool.Resource.Database.NewDb.dbf.tmp
其中MigrationTool是默认命名空间,Resource\Database是资源文件存放的路径,NewDb.dbf.tmp是文件名。