У меня есть четыре сборки (плюс .NET 3.5 system.core), которые я устанавливаю как небезопасные сборки CLR в базе данных SQL Server 2005.Установка сборок в правильном порядке (на основе их зависимостей) работает нормально, и я могу использовать нужные мне функции CLR.Если возможно, я бы хотел использовать ILMerge на четырех сборках, чтобы я мог установить только одну DLL.В любом случае, только одна сборка напрямую связана со стороной SQL;другие являются зависимостями.Случается, что одна из этих четырех сборок является сборкой XmlSerializer, созданной с помощью sgen, что необходимо, поскольку CLR SQL Server не позволяет создавать сериализатор во время выполнения.
В следующем обсуждении сборки называются:
- ClrIntegration.dll (это библиотека CLR в Visual Studio 2008 и единственная библиотека, на которую фактически ссылается SQL)
- CalcLibrary.dll (это всего лишь библиотека .NET 3.5, которую использует ClrIntegration.dll)
- CalcLibrary.Schema.dll (это библиотека .NET 3.5, код которой полностью создаетсязапуск xsd.exe на двух файлах .xsd - CalcLibrary.dll использует эту библиотеку)
- 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Я столкнулся с несколькими проблемами здесь.
Если я просто запускаю 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.Есть ли здесь какие-нибудь решения?
Файл ILMerge.doc, который поставляется с установкой ILMerge, предполагает, что добавление /union
и / или /closed
может решить некоторые проблемы.Но использование одного /union
или /union
вместе с /closed
приводит к сбою ILMerge со следующей ошибкой:
Исключительная ситуация при объединении:
Неразрешенная ссылка на сборку не разрешена:CalcLibrary.
Трассировка стека следует за ошибкой.Я подозреваю, что, поскольку ClrIntegration должна ссылаться на версию CalcLibrary database , а не на версию решения VS2008, ILMerge не может найти тип и, следовательно, не может завершить объединение, даже если CalcLibrary.dll - это та же библиотека.Правильно ли мое подозрение?Есть ли способ обойти эту проблему?