在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件事

  1. 创建模板文件,生成.cs代码
  2. 将文本文件(或* .sql文件)包含在与模板文件相同的项目中
  3. 配置模板以在每次构建时重新创建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 #>"); } } } 

如果您不想将模板配置为在构建中重新创建,那么只需打开它并保存它就可以了。