.NET 将 .config 文件嵌入到程序集
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Iron_Ye/article/details/83979628
.NET 将 .config 文件嵌入到程序集
最近,团队中的一位同事实现了一个小程序,供主程序调用。为了小程序分发的方便性,使用了 Costura.Fody
将其依赖的 dll
都嵌入到了 exe
中。但是,其中的 log4net.dll
又需要一个 *.config
文件才能正常工作,而 Costura.Fody
又不支持此类文件的嵌入。
我们先来复现一下问题场景,关于 Costura.Fody
和 log4net
的使用可以参考:
首先,在一个 C#
控制台程序中通过 NuGet
引用 log4net
和 Costura.Fody
两个组件,然后在程序的 App.config
文件中添加如下配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
</root>
<logger name="mylogger">
<level value="ALL"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout"/>
</appender>
</log4net>
</configuration>
这些配置用于指定 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
文件,文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura/>
</Weavers>
最后,编译此项目。你会发现 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(嵌入资源)
,这样一来,文件将作为资源被嵌入到程序集中。
并且,可以在运行时通过 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();
}
这只是其中一种将文件作为资源嵌入到程序集的方法,欲了解更多方法,可参考 Various Build Actions in Visual Studio 。
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
去探索更多的方法。
参考资料
.NET 将 .config 文件嵌入到程序集的更多相关文章
- C#项目中关于多个程序集下App.config文件的问题
在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice.wcf服务时生成:也有手动建立的配置文件直接默认名就为app.config.这些配置有的保存当前程序集用 ...
- Debug目录、Release目录,bin目录、obj目录,vshost.exe.config文件、.exe.config文件分析【C#】
原文地址:http://blog.csdn.net/itwit/article/details/6803338 今天写程序的时候,需要更改.exe.config文件中的引用的webservice地址, ...
- 如何更改c#项目的App.config文件
动态修改App.Config 和web.Config 首先假设你的应用程序配置文件如下: <?xml version="1.0" encoding="utf-8&q ...
- IOC注入框架——Unity中Web.Config文件的配置与调用
Unity 应用程序块可以从 XML 配置文件中读取配置信息.配置文件可以是 Windows Forms 应用程序的 App.config 或者 ASP.NET 应用程序的 Web.config.当然 ...
- WPF程序中App.Config文件的读与写
WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...
- Unity中Web.Config文件的配置与调用
在上一篇文章“Unit简单依赖注入”我们可以实现构造对象和被依赖对象之间的 松耦合,使我们的抽象层(Player)能够保持稳定,但是在并没有把客户类和Player类之间彻底解耦,即当我们不想使用MP3 ...
- Rabbit MQ config文件解析
Rabbit MQ config文件解析 tcp_listeners:用于监听AMQP连接的端口或主机名/对(不带TLS),默认端口:5672 2.numtcpacceptors :将接受TCP侦听器 ...
- 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...
- 【Win 10应用开发】把文件嵌入到XML文档
把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...
随机推荐
- About CNN(convolutional neural network)
NO.1卷积神经网络基本概念 CNN是第一个被成功训练的多层深度神经网络结构,具有较强的容错.自学习及并行处理能力.最初是为识别二维图像而设计的多层感知器,局部连接和权值共享网络结构 类似于生物神经网 ...
- js表格隔行换色和hover效果
<!--js效果--> <script src="js/jquery.min.js" language="javascript">< ...
- xampp、phpstudy安装phalcon
1.下载扩展 https://github.com/phalcon/cphalcon/releases/tag/v3.4.1选择PHP对应版本的phalcon扩展 2.PHP.ini 配置phalco ...
- 关于.net core 在docker中监听地址设置踩坑记
1.今天在做docker容器的时候发现如果将.net core 内部监听地址设置为localhost:8888. 2.在docker build -p 6444:8888 运行容器后,外部通过6444 ...
- 微信小程序 上传图的功能
首先选择图片,然后循环,再就是在点击发布的时候循环图片地址赋值,包括删除命令 js代码: //选择图片 uploadImgAdd: function(e) { var imgs = this.data ...
- mycat读写分离+垂直切分+水平切分+er分片+全局表 测试
原文http://blog.163.com/bigoceanwu@126/blog/static/172718064201683031639683/ 读写分离:利用最基础的mysql主从复制,事务性的 ...
- [LeetCode]Subsets II生成组合序列
class Solution {//生成全部[不反复]的组合.生成组合仅仅要採用递归,由序列从前往后遍历就可以. 至于去重,依据分析相应的递归树可知.同一个父节点出来的两个分支不能一样(即不能与前一个 ...
- jquery-ui日期时间控件实现
日期控件和时间控件为独立控件,日期时间控件要同一时候导入日期控件和时间控件的js,然后在日期控件加入时间控件显示參数,没有导入时间控件js.日期控件函数设置的时间控件參将包错 日期控件官网网址:htt ...
- BZOJ 1088 水模拟
BZOJ水一道~ 枚举前两个位置是否放雷,模拟向下推.能够则ans++ #include "stdio.h" #include "string.h" int a ...
- Leetcode:Singel Number
问题描写叙述: Given an array of integers, every element appears twice except for one. Find that single one ...