The given assembly name or codebase was invalid
27.09.2006 Среда 17:42
Софт
BizTalk 2006
.Net Framework 2.0
Симптомы
Итак, проблема проявилась при тестировании только что развёрнутого BizTalk-приложения. На первом же receive pipeline'е в Event log'е появлялось следующее сообщение:
There was a failure executing the receive pipeline
blah-blah-blah...
Reason: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
При этом имел место следующий симптом - при добавлении pipeline'а в приложение при помощи BizTalk Administration Console (Resourses -> Add) pipeline вполне нормально добавлялся и в дальнейшем отображался с правильным именем. Однако при назначении pipeline'а какому-либо receive location'у, в списке доступных pipeline'ов имя моего pipeline'а было неправильным - а именно, отсутствовала последняя цифра в PublicKeyToken!
То есть правильное имя, например, такое:
MyPipeline, MyCustomPipelines, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=f90fe11c5553f473
А отображалось такое имя:
MyPipeline, MyCustomPipelines, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=f90fe11c5553f47
ПричинаВыяснилось, что pipeline имел очень длинное fully qualified name (значительно длиннее приведённого выше примера). А в базе данных BizTalk, в таблице BizTalkMgmtDb.dbo.bts_pipeline, предназначенной для хранения данных о pipeline'ах, колонка, содержащая fully qualified name pipeline'а имеет длину 256 символов, каковой и не хватало для моего pipeline'а, имя которого имело в длину 257 символов.
РешениеПроблема была решена уменьшением длины fully qualified name pipeline'а. А именно, было изменено имя assembly, содержащей pipeline, как наиболее безболезненный вариант решения. Коллега предлагал и вовсе кардинальный способ - увеличить длину колонки в BizTalk'овской таблице. :) Но мне это показалось слишком "грубым" решением. В конце концов, имя pipeline'а может содержаться далеко не только в этой таблице. И вообще, править внутренние BizTalk'овские таблицы - это уже хакерство какое-то.
МоральНе нужно слишком усердствовать в изобретении длинных имён, namespace'ов и т.п. Как показывает практика, иногда существуют вполне реальные ограничения по длине для таких вещей. Также можно посоветовать Microsoft увеличить максимально допустимую длину fully quialified name pipeline'а.
Примечания1) Стоит отметить, что в настоящий момент упомянутый выше pipeline, имеющий 257 символов в имени, вполне успешно работает на production box'е. Каким образом - остаётся загадкой. Возможно, это как-то связано с разными вариантами deployment'а - через BizTalk Administration Console, через BizTalk Explorer в Visual Studio, через командую строку и т.д. Как бы то ни было, принято решение срочно это дело исправить.
2) Ошибка "The given assembly name or codebase was invalid" появляется тогда когда assembly с таким именем найдена, но её Version, PublicKeyToken или Culture не совпадают с ожидаемыми. Она может появляться в самых разнообразных контекстах, никак не связанных с BizTalk'ом.