Чтение файла во время компиляции в C # - PullRequest
6 голосов
/ 07 июля 2011

Я пишу некоторые модульные тесты, в которых мне нужен поддельный XML-файл. Я могу создать этот файл и потребовать его развертывания с помощью модульных тестов, но опыт показывает, что в моем офисе это большая головная боль. Поэтому я решил, что файл будет создан UT.

StreamWriter sw = new StreamWriter(testFileName);
sw.Write(contents);
sw.Close();

Теперь проблема в содержимом строки. Это практически длинный xml, примерно такой:

string contents = 
@"<?xml version="1.0" encoding="windows-1251"?>
  <blah>
  ~100 lines here
  </blah> ";

Я не хочу, чтобы это было в том же файле, что и остальная часть кода. Я хочу, чтобы строка генерировалась во время компиляции из файла.

В C ++ я бы сделал это

string contents = "
#include "test.xml"
   ";

Возможно ли это как-то в C #?

Ответы [ 6 ]

9 голосов
/ 07 июля 2011

Почему бы вам не включить его в ресурс?

1 голос
/ 07 июля 2011

Используйте ресурсы (файл resx) и добавьте ваш xml-файл.Затем вы можете получить доступ, используя MyNs.MyResources.MyXmlFile.

0 голосов
/ 03 июня 2016

Вы можете сделать это с помощью шаблона 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 #>");
        }
    }
}

Если вы не хотите настраивать свой шаблон для повторного создания в сборке, просто откройте и сохраните его.

0 голосов
/ 07 июля 2011

Вы можете пойти по пути файла ресурсов, но, в зависимости от того, сколько ресурсов / насколько они велики (и XML может быть большим), вы можете в конечном итоге столкнуться с проблемами компиляции (я сделал).с тех пор перешел от ресурсов к синглетонам.Чтение текстового файла с помощью File.ReadAllText довольно просто и по-прежнему дружественно к IntelliSense.

0 голосов
/ 07 июля 2011

Если содержимое статичное, почему вы не можете передать его в систему контроля версий? Добавьте его в свой проект, и тогда он всегда будет именно там, где вы ожидаете.

0 голосов
/ 07 июля 2011

Я обычно добавляю такие тестовые файлы непосредственно в проект модульного теста C # и задаю их как «Содержимое» и «Копировать, если новее», которые будут скопированы в каталог bin во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...