博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET 将 .config 文件嵌入到程序集
阅读量:5158 次
发布时间:2019-06-13

本文共 2649 字,大约阅读时间需要 8 分钟。

原文:

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Iron_Ye/article/details/83979628

.NET 将 .config 文件嵌入到程序集

最近,团队中的一位同事实现了一个小程序,供主程序调用。为了小程序分发的方便性,使用了 Costura.Fody 将其依赖的 dll 都嵌入到了 exe 中。但是,其中的 log4net.dll 又需要一个 *.config 文件才能正常工作,而 Costura.Fody 又不支持此类文件的嵌入。

我们先来复现一下问题场景,关于 Costura.Fodylog4net 的使用可以参考:

首先,在一个 C# 控制台程序中通过 NuGet 引用 log4netCostura.Fody 两个组件,然后在程序的 App.config 文件中添加如下配置:

这些配置用于指定 log4net 如何工作,需要在程序的入口处加载这些配置信息:

static void Main(string[] args){
// 从默认的配置文件(App.config)中读取配置信息 log4net.Config.XmlConfigurator.Configure(); var logger = LogManager.GetLogger("mylogger"); logger.Info("Starting..."); Console.ReadLine();}

然后,为 Costura.Fody 添加一个 FodyWeavers.xml 文件,文件内容如下:

最后,编译此项目。你会发现 log4net.dll 并未出现在生成目录中,而是被合并到了 MyConsoleApp.exe 中。同时,生成目录中还有一个 MyConsoleApp.exe.config 文件(App.config)生成的。如果删除该文件,MyConsoleApp.exe 中的 log4net 不能正常工作。

因此,如果要实现 MyConsoleApp.exe 单文件分发,就要将 App.config 嵌入到该 exe 中,并且 log4net 要能识别嵌入的文件。

Embedded Resource

好在 Visual Studio 支持将项目中的某个文件的 Build Action 设置为 Embedded Resource(嵌入资源),这样一来,文件将作为资源被嵌入到程序集中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lyb25fWWU=,size_16,color_FFFFFF,t_70

并且,可以在运行时通过 Assembly.GetManifestResourceStream() 方法取文件内容:

var assembly = Assembly.GetExecutingAssembly();var resourceName = "MyCompany.MyProduct.MyFile.txt";using (Stream stream = assembly.GetManifestResourceStream(resourceName))using (StreamReader reader = new StreamReader(stream)){
string result = reader.ReadToEnd();}

这只是其中一种将文件作为资源嵌入到程序集的方法,欲了解更多方法,可参考 。

Configure(Stream configStream)

查资料发现,log4net 支持从 Stream 中加载配置文件:

log4net.Config.XmlConfigurator.Configure(Stream configStream);

那么,结合 Embedded Resource,问题就非常简单了:

static void Main(string[] args){
var assembly = Assembly.GetExecutingAssembly(); var resourceName = "MyConsoleApp.App.config"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) {
// 从 Stream 中读取 log4net 的配置信息 log4net.Config.XmlConfigurator.Configure(stream); } var logger = LogManager.GetLogger("mylogger"); logger.Info("Starting..."); Console.ReadLine();}

再次编译项目,MyConsoleApp.exe.config 也从生成目录中消失了,单独的一个 MyConsoleApp.exe 也能正常运行了。

总结

本文只是以 *.config 文件为例来说明如何将文件作为资源嵌入到程序集中,其它格式的文件也是支持的,并且还有其它的嵌入方式,感兴趣的可以通过 Build Action 去探索更多的方法。

参考资料

posted on
2019-03-15 11:12 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10535776.html

你可能感兴趣的文章
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
BeanShell简介
查看>>
python字符串操作
查看>>
MySQL学习之备份
查看>>
不同程序语言的注释和变量要求
查看>>
语言基础(9):static, extern 和 inline
查看>>
windows linux—unix 跨平台通信集成控制系统
查看>>
【编程练习】复习一下树的遍历
查看>>
邮件和短信验证码
查看>>
(转)Android studio 使用心得(五)—代码混淆和破解apk
查看>>
构建之法阅读笔记03
查看>>
ES5_03_Object扩展
查看>>
Apache-ab 接口性能测试
查看>>
EF 4.1 Code First Walkthrough
查看>>