Зарегистрировать функцию CLR (на основе WCF) в SQL Server 2012
У меня есть хранимая процедура на основе CLR, которая использовала MsmqIntegrationBinding
отправлять сообщения на удаленные MSMQ. В SQL Server 2005 все работало нормально, но теперь ожидается обновление с 2005 по 2012 годы. Я пытался зарегистрировать CLR (SP) в SQL Server 2012, но при регистрации System.ServiceModell.DLL
возникла следующая ошибка.
Msg 6544, уровень 16, состояние 1, строка 1
СОЗДАТЬ СБОРКУ для сборки "System.ServiceModel" не удалось, поскольку сборка "microsoft.visualbasic.activities.compiler" повреждена или не является чистой сборкой.NET. Неподтверждаемый PE Заголовок / родная заглушка.
Я искал решение, и похоже, что немногие люди сталкиваются с такой же проблемой, и на данный момент нет решения.
Основная причина использования MSMQIntegrationBinding
Мы хотим убедиться, что каждое сообщение доставляется только один раз. Как вы можете видеть, я был очень заинтересован в ExactlyOnce
свойство, которого нет в обычном классе system.messaging. Мы обрабатываем тысячи сообщений, и порядок сообщений очень важен. Кроме того, каждое сообщение помечается идентификатором, и если любое сообщение отправляется с идентификатором, который меньше, чем сообщение, отправленное ранее, клиентская система останавливается (большая проблема).
Я также переписал хранимую процедуру CLR, используя system.messaging. Мне просто нужны предложения, может ли это поддержать сценарий, который я упомянул выше.
1 ответ
У меня та же проблема, что и у вас, и я не знаю, есть ли решение для нее. То, что я нашел, это:
Существует два типа сборок.NET. Чистые сборки.NET содержат только инструкции MSIL. Смешанные сборки содержат как неуправляемые машинные инструкции, так и инструкции MSIL. Смешанные сборки обычно компилируются компилятором C++ с ключом / clr, но содержат машинные инструкции, полученные из собственного кода C++.
Независимо от того, какая версия SQL Server, CREATE ASSEMBLY позволяет регистрировать только чистые сборки.NET. SQL Server всегда требовал, чтобы сборка, загружаемая в базу данных SQL Server с помощью CREATE ASSEMBLY, содержала только инструкции MSIL (чистая сборка). CREATE ASSEMBLY вызовет вышеуказанную ошибку, если регистрируемая сборка является смешанной сборкой.
Дело в том, что нам действительно нужно обратиться к System.ServiceModel
,
Итак, я думаю, что в ближайшем будущем это не исправить. То, что мы должны сделать, это код по-другому.