Задача MSBuild для сборки загрузить мою сборку и построить сериализованную конфигурацию NHibernate - PullRequest
5 голосов
/ 18 апреля 2011

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

Проблема: я пытаюсь сериализовать копию моей конфигурации NHibernate и сохранить ее в... проект, который использовался для его генерации!

Текущее решение вручную: у меня есть проект Foo, который

  • содержит серию файлов DomainObject.Map.cs
  • Ссылка на файл "nhconfig.bin" для встраивания в качестве ресурса.
  • Содержит статический метод FooGenerateNHConfig, который создает объект конфигурации и сериализует его в nhconfig.bin.

Чтобы сгенерировать его, я:

  1. (только в первый раз: создайте пустой nhconfig.bin, который действует как заполнитель).
  2. Build Foo.
  3. Вызовите юниттест, вызывающий FooGenerateNHConfig.
  4. Перестройка Foo.
  5. Развертывание приложения.

Я пытаюсь автоматизировать это, и подумал, что это будет просто:

  1. Создать проект Foo.BuildSupпорт, который ссылается на Foo.
  2. Определите в нем задачу X, которая будет вызывать FooGenerateNHConfig.
  3. Установите цель AfterCompile, которая будет вызывать X.

К сожалению, ятеперь получаю 2 ошибки.

  1. Во-первых, несколько странное исключение:

    FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
    ---> System.Runtime.Serialization.SerializationException: Unable to find assembly 'FluentNHibernate, Version=1.1.0.685, Culture=neutral, PublicKeyToken=8aa435e3cb308880'.
    

    Мне кажется, что FluentNHibernate жалуется, что не может найти сборку FluentNHibernate?

  2. После первого запуска Задачи из Visual Studio Visual Studio (devenv.exe) блокирует мой Foo.BuildSupport.dll И мой Foo.exe (предположительно потому, что он просто видит их).в качестве поддержки библиотек, а не реальных библиотек сборки), поэтому я не могу их перестроить.Как правило, это происходит потому, что vs предполагает (и, вероятно, справедливо), что библиотека BuildSupport довольно статична и не использует

Какой хороший способ автоматизации такого процесса, как этот?У меня есть только некоторые предварительные мысли прямо сейчас, но единственное, о чем я могу думать, - это создание полностью отдельного исполняемого файла, который будет запускаться msbuild (видел задачу, чтобы сделать эквивалент этого, не может найти ее сейчас), или что-то более сложноезадействовать отдельный домен приложения и вручную вызвать функцию через отражение.Но прежде чем идти дальше по этому пути, я упускаю что-то более простое и более очевидное?

1 Ответ

2 голосов
/ 27 апреля 2011

У меня была проблема, очень похожая на эту.Моя проблема была связана с десериализацией Xml в MSBuild для классов, содержащихся в сторонней сборке.Он не мог разрешить сборку, необходимую для работы сериализации, даже несмотря на то, что сборки были частью проекта, и у него не было проблем с их разрешением вне сериализации.Не могу дать более техническое описание проблемы, чем это, но я нашел этот фрагмент кода, который исправил проблему для меня,

        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Assembly ayResult = null;
            string sShortAssemblyName = args.Name.Split(',')[0];
            Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly ayAssembly in ayAssemblies)
            {
                if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
                {
                    ayResult = ayAssembly;
                    break;
                }
            }
            return ayResult;
        }

        public Constructor()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }

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

Надеюсь, это полезно!

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