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

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

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

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

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

  • .NET 合并程序集(将 dll 合并到 exe 中)
  • log4net 详解

首先,在一个 C# 控制台程序中通过 NuGet 引用 log4netCostura.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 去探索更多的方法。

参考资料

  • How to read embedded resource text file
  • Various Build Actions in Visual Studio
  • What are the various Build Action settings in Visual Studio …

posted on 2019-03-15 11:12 NET未来之路 阅读(...) 评论(...) 编辑 收藏

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

.NET 将 .config 文件嵌入到程序集相关推荐

  1. C#项目中关于多个程序集下App.config文件的问题

    在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice.wcf服务时生成:也有手动建立的配置文件直接默认名就为app.config. 这些配置有的保存当前程序集 ...

  2. VS2005 ASP.NET2.0安装项目的制作(包括数据库创建、站点创建、IIS属性修改、Web.Config文件修改)

    站点: 如果新建默认的Web安装项目,那它将创建的默认网站下的一个虚拟应用程序目录而不是一个新的站点.故我们只有创建新的安装项目,而不是Web安装项目.然后通过安装类进行自定义操作,创建新站如下图: ...

  3. Unity中Web.Config文件的配置与调用

    在上一篇文章"Unit简单依赖注入"我们可以实现构造对象和被依赖对象之间的 松耦合,使我们的抽象层(Player)能够保持稳定,但是在并没有把客户类和Player类之间彻底解耦,即 ...

  4. 如何在.config文件自定义配置节

    在.NET程序中一般都有个应用程序配置文件在ASP.NET中是web.config,在控制台应用程序和Windows应用程序中是app.config.我们通常使用此配置文件来设置一些程序会用到的信息, ...

  5. ATS上的hosting.config和volume.config文件解读

    为了更加灵活和精细地规划缓存磁盘的空间使用,我们可以更进一步地使用hosting.config和volume.config文件.   hosting.config 描述域名和分卷的对应关系: host ...

  6. Web.Config文件配置之限制上传文件大小和时间

    在邮件发送系统或者其他一些传送文件的网站中,用户传送文件的大小是有限制的,因为这样不但可以节省服务器的空间,还可以提高传送文件的速度.下面介绍如何在Web.Config文件中配置限制上传文件大小与时间 ...

  7. Web.Config文件配置之连接默认错误页

    在一些网站中,当网络地址发生错误时,通常会自动跳转到一个页面,并在该页面显示错误信息,此功能叶可以通过配置Web.Config文件配置实现.例如访问者在访问网站时出现错误,程序将跳转到默认页面erro ...

  8. 读取并修改App.config文件(转载)

    1. 向项目添加app.config文件: 右击项目名称,选择"添加"→"添加新建项",在出现的"添加新项"对话框中,选择"添加应 ...

  9. Web.config文件使用

    一.认识Web.config文件 Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式), ...

最新文章

  1. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍
  2. python编程入门p-Python编程_基础入门
  3. sc delete:指定的服务已经标记为删除
  4. 查看回滚事物sql_卧槽:这款 SQL自动检查神器,吊炸天的功能,真TMD多!!
  5. MySQL执行外部sql脚本文件的命令
  6. osgi和spring区别_OSGI和Spring动态模块–简单的Hello World
  7. 我是如何成功准备VUE项目之前的开发环境?
  8. [Vue]Scoped Css与Css Modules的区别
  9. Java NIO学习
  10. C++ vector查找某个特定元素是否存在
  11. JasperReport里面的Demo
  12. 如何在vba中实现目录浏览对话框
  13. Composite模式
  14. oracle 导入性能,EXP,EXPDP数据导入本地性能测试的一点心得
  15. springboot允许跨域注解_springboot 设置允许跨域的方法
  16. 【FeignClient报错】Cannot deserialize value of type``from Object value (token `JsonToken.START_OBJECT`)
  17. Python4班平均成绩统计_空中交通管理学院2017级学生 20182019学年第一学期成绩分析报告...
  18. 要命啦!Word中快速录入大全,内含快捷键小技巧,快来一起学习!
  19. 微信小程序优惠劵功能(包含用户需求,axure原型设计,数据库设计,后台功能,微信小程序功能)
  20. 低频125K安卓工业三防手持机lora通信

热门文章

  1. python getcwd 与dirname_Python中获取路径os.getcwd()和os.path.dirname(os.path.realpath(__file__))的区别和对比...
  2. ajax servlet怎么接收_【百战程序员从开始到植发】之AJAX
  3. sqlserver php用户登陆页,SQLServer限制IP,限制用户,限制SSMS登录
  4. 2020年前端如何适应大环境,发展的前途与趋势是怎么样的?
  5. 面向对象编程:包,继承,多态,抽象类,接口
  6. 虚拟网站禁用php,虚拟主机php程序fsockopen函数被禁用
  7. mysql5.718免安装教程_mysql5.7.18版本免安装配置教程
  8. 求和符号上下的值怎么打_Excel快速求和的N种方法,一网打尽
  9. nginx location 匹配 多个规则_后端程序员不得不会的 Nginx 转发匹配规则
  10. c语言程序与实验系统,C/C ++程序设计学习与实验软件系统v2019 最新版下载_云间下载...