Как использовать ILMerge со сборками SQL Server 2005 CLR и XmlSerializer - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть четыре сборки (плюс .NET 3.5 system.core), которые я устанавливаю как небезопасные сборки CLR в базе данных SQL Server 2005.Установка сборок в правильном порядке (на основе их зависимостей) работает нормально, и я могу использовать нужные мне функции CLR.Если возможно, я бы хотел использовать ILMerge на четырех сборках, чтобы я мог установить только одну DLL.В любом случае, только одна сборка напрямую связана со стороной SQL;другие являются зависимостями.Случается, что одна из этих четырех сборок является сборкой XmlSerializer, созданной с помощью sgen, что необходимо, поскольку CLR SQL Server не позволяет создавать сериализатор во время выполнения.

В следующем обсуждении сборки называются:

  1. ClrIntegration.dll (это библиотека CLR в Visual Studio 2008 и единственная библиотека, на которую фактически ссылается SQL)
  2. CalcLibrary.dll (это всего лишь библиотека .NET 3.5, которую использует ClrIntegration.dll)
  3. CalcLibrary.Schema.dll (это библиотека .NET 3.5, код которой полностью создаетсязапуск xsd.exe на двух файлах .xsd - CalcLibrary.dll использует эту библиотеку)
  4. CalcLibrary.Schema.XmlSerializers.dll (генерируется при запуске sgen на CalcLibrary.Schema и являетсяиспользуется автоматически XmlSerializer в CalcLibrary.dll)

Насколько мне известно, невозможно ссылаться на версию CalcLibrary.dll, которая находится в моем VS2008 решение напрямую из проекта ClrIntegration.Вместо этого я должен установить CalcLibrary.dll на работающем экземпляре SQL Server 2005 и добавить его в качестве ссылки на базу данных в проект ClrIntegration.Это неудобство, но я заставил его работать до сих пор.

Базовая командная строка, которую я использую в качестве события после сборки в проекте ClrIntegration:

"c:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /targetplatform:v2 /out:ClrMergedAssembly.dll \
"$(TargetDir)ClrIntegration.dll" \
"$(SolutionDir)Source\CalcLibrary\$(OutDir)CalcLibrary.dll" \
"$(SolutionDir)Source\CalcLibrary.Schema\$(OutDir)CalcLibrary.Schema.dll" \
"$(SolutionDir)Source\CalcLibrary.Schema\$(OutDir)CalcLibrary.Schema.XmlSerializers.dll"

IЯ столкнулся с несколькими проблемами здесь.

  1. Если я просто запускаю ILMerge, как показано выше, это работает, и я получаю ClrMergedAssembly.dll.Я могу установить ClrMergedAssembly.dll на SQL Server 2005, но когда я пытаюсь его использовать, все, что использует XmlSerializer, выдает мне ошибку типа:

    Ошибка .NET Framework произошла во время выполнения пользовательского заданияподпрограмма или агрегат «Безотносительно»:
    System.InvalidOperationException: Невозможно загрузить динамически сгенерированную сборку сериализации.В некоторых средах размещения функциональность загрузки сборок ограничена, рассмотрите возможность использования предварительно сгенерированного сериализатора.

    Это та же ошибка, что и я, когда вообще не генерирую XmlSerializer.Я нашел эту отличную запись в блоге , в которой говорится, что sgen необходимо запустить снова после ILMerge, но это создает две проблемы.Во-первых, мне действительно нужно, чтобы sgen был запущен только на CalcLibrary.Schema.dll.Запуск его на всей сборке плохо провалится;фактически, именно поэтому CalcLibrary.Schema отделена от CalcLibrary.Во-вторых, наличие отдельного сериализатора несколько противоречит цели использования ILMerge: я хочу развернуть только одну DLL.Есть ли здесь какие-нибудь решения?

  2. Файл ILMerge.doc, который поставляется с установкой ILMerge, предполагает, что добавление /union и / или /closed может решить некоторые проблемы.Но использование одного /union или /union вместе с /closed приводит к сбою ILMerge со следующей ошибкой:

    Исключительная ситуация при объединении:
    Неразрешенная ссылка на сборку не разрешена:CalcLibrary.

    Трассировка стека следует за ошибкой.Я подозреваю, что, поскольку ClrIntegration должна ссылаться на версию CalcLibrary database , а не на версию решения VS2008, ILMerge не может найти тип и, следовательно, не может завершить объединение, даже если CalcLibrary.dll - это та же библиотека.Правильно ли мое подозрение?Есть ли способ обойти эту проблему?

1 Ответ

1 голос
/ 04 февраля 2012

Вы не можете. Код фреймворка всегда ищет сгенерированные sgen классы в другой сборке, названной с суффиксом .XmlSerializers, и он жестко закодирован в фреймворке. Проверьте с вашим инструментом декомпиляции.

...