在C#中读取文件编译时
我正在编写一些unit testing,其中我需要一个假的xml文件。 我可以创建该文件,并要求它与unit testing一起部署,但经验表明,在我的办公室,这是一个很头疼的问题。 所以我决定该文件将由UT创建。
StreamWriter sw = new StreamWriter(testFileName); sw.Write(contents); sw.Close();
现在的问题是内容字符串。 它实际上是一个很长的xml,如下所示:
string contents = @" ~100 lines here ";
我不希望它与其余代码位于同一个文件中。 我希望从文件生成编译时的字符串。
在C ++中,我会这样做
string contents = " #include "test.xml" ";
在C#中有可能以某种方式吗?
为什么不将它包含在资源中?
使用资源(resx文件)并添加xml文件。 然后,您可以使用MyNs.MyResources.MyXmlFile进行访问。
我通常将这些测试文件直接添加到unit testingC#项目中,并在编译期间将它们设置为“Content”和“Copy if newer”以复制到bin目录。
如果内容是静态的,为什么不能将它提交给源代码控制? 将它添加到您的项目中,然后它将始终完全符合您的预期。
你可以去资源文件路由,但是,根据它们有多少资源/多大(并且XML可能很大),你最终可能会遇到编译问题(我做过)。
我已经从资源转变为单身人士。 使用File.ReadAllText读取文本文件非常简单,它仍然是IntelliSense友好的。
您可以使用T4模板执行此操作。 你需要的是3件事
- 创建模板文件,生成.cs代码
- 将文本文件(或* .sql文件)包含在与模板文件相同的项目中
- 配置模板以在每次构建时重新创建t4模板
你的template.tt
文件就像这样
<#@ template debug="true" hostSpecific="true" #> <#@ output extension=".cs" #> <#@ Assembly Name="System.Core" #> <#@ Assembly Name="System.Windows.Forms" #> <#@ import namespace="System" #> <#@ import namespace="System.IO" #> <# string TextFromFile = File.ReadAllText(Host.ResolvePath("my_file_next_to_my_template.txt")); #> // This is the output code from your template namespace MyNameSpace { class MyGeneratedClass { static void main (string[] args) { System.Console.WriteLine("<#= TextFromFile #>"); } } }
如果您不想将模板配置为在构建中重新创建,那么只需打开它并保存它就可以了。