Вопрос

Разработка конфигурационного серверного кода в пользовательском проекте

Добрый день!

Выполнил по шагам действия описанные в https://academy.terrasoft.ru/documents/technic-sdk/7-12/razrabotka-konfiguracionnogo-servernogo-koda-v-polzovatelskom-proekte. При запуске проекта выходит ошибка:

Terrasoft.Common.NullOrEmptyException was unhandled by user code
  HResult=-2146232832
  Message=The "Default" workspace assembly is not initialized
  Source=Terrasoft.Core
  StackTrace:
       at Terrasoft.Core.Configuration.SysWorkspace.get_WorkspaceAssembly()
       at Terrasoft.Core.SchemaManager`1.get_Assembly()
       at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
       at Terrasoft.Core.Manager`2.GetInstanceByName(String name)
       at Iplast.MyContactCreator.Execute(UserConnection userConnection) in c:\users\adm-ruslan\documents\visual studio 2015\Projects\mycompany\mycompany\MyContactCreator.cs:line 16
       at Terrasoft.Tools.WorkspaceConsole.WorkspaceConsoleApplication.ExecuteScript(String assemblyFileName, String typeName)
  InnerException: 

В "Конфигураторе" сообщение "The "Default" workspace assembly is not initialized" не отображается. На всякий случай из Visual Studio запускал BuildWorkspace и RebuildWorkSpace, компиляция прошла успешно, но это не помогло.

Подскажите, пожалуйста, в чем проблема. 

 

Нравится

31 комментарий

Ошибка возникает во время получения схемы:

var schema = userConnection.EntitySchemaManager.GetInstanceByName("Contact");

Просто случайно вместо Contact указал Contac и ошибка поменялась на:

Item with name "Contac" not found

 Т.е. обращение к приложению происходит, но по какой то причине рабочее пространство Default оказывается не инициализировано. В чем дело не понимаю.

Перевел сайт на http протокол, т.к. стал подозревать что проблема может быть в неподписанном сертификате. Не помогло.

Дело не в протоколе, такое сообщение значит, что не скомпилировалась конфигурация. См. аналогичное обсуждение тут.

Это я перепробовал по несколько раз, не помогает.

Нужно опубликовать какую-то схему, чтобы сборка конфигурации обновилась.

Почему подумал на протокол, потому что пример с Executor'ом как раз не работал с неподписанным сертификатом. После того как перевел сайт на http, Executor успешно отработал. Тот же  самый пример через WorkSpaceConsole не работает. Попробую опубликовать объект, т.е. таблицу.

Зверев Александр,

Опубликовал таблицу с префиксом Usr, публикация успешно завершилась. Запустил проект из VS, та же ошибка. Засада какая то.

Если не работает только из Visual Studio, интеграция с ней может быть настроена неверно. Как настроить, см. тут.

VS настроил как описано в инструкции. Команды build, rebuild и update рабочего пространства выполняются без ошибок. Но выполнение проекта все равно выдает ошибку: The "Default" workspace assembly is not initialized

Вот что нашел с помощью отладчика:

Почему-то переменная "Assembly" не инициализирована.

Как это исправить?

Это и значит, что генерация кода и компиляция его в dll не прошли успешно. Если при компиляции из раздела «Конфигурация» всё нормально, а при компиляции при помощи внешних инструментов — нет, то что-то не то в их настройке.

Скорее всего так и есть. Еще раз перепроверил параметры внешних команд VS (build и rebuild), обнаружил что не был указан параметр "confRuntimeParentDirectory", хотя был уверен что копи-пастом все переносил из учебника. Надеюсь это решит проблему. Если нет то продолжу свой квест - при ручной загрузке рабочего пространства командой:

userConnection.Workspace.WorkspaceAssembly =  fswal.LoadAssemblyToWorkspace(userConnection.Workspace); 

путь к сборке не верный указан:

Could not find a part of the path 'C:\inetpub\BPMdevelopment\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.WebApp\Terrasoft.Configuration\bin\Terrasoft.Configuration.dll'.

Не найду где это указывается в настройках. Но уже есть за что зацепиться. 

Судя по два раза повторяющемуся  названию папки «Terrasoft.WebApp», где-то прописан относительный путь к «Terrasoft.Configuration.dll», начиная с неё, в результате утилита приписывает слева путь места, откуда она запущена и полный путь выходит неправильный. Попробуйте найти  эту настройку и поменять на полный путь, начиная с буквы диска.

Добавление параметра "confRuntimeParentDirectory" не решило проблему. Найти где прописан путь пока тоже не удалось. 

В таком случае, пока не найдёте место, где прописан путь, можно разрабатывать из веб-интерфейса системы.

Из веб интерфейса писать C# код не удобно - нет отладки. К тому же я хочу реализовать свою библиотеку.

Тогда продолжайте искать, где неверно прописан путь.

Проблема в том что я не помню чтобы прописывал какой-либо путь кроме команд Build, Rebuild и Update Workspace. И в файле Terrasoft.Tools.WorkspaceConsole.exe.config что либо похожего на путь не вижу:

есть только один ключ "ConfigurationProjectPath", который изначально был пустым. И за что он отвечает не понятно.

Параметры запуска WorkspaceConsole описаны тут.

Спасибо, Александр, за помощь! Решил указать параметр "configurationPath" и переменная "Assembly" стала инициализироваться. Но, этого не было написано в инструкции по созданию пользовательского проекта. Очередной шаг в квесте выполнен. Следующее испытание: "Value for argument "outputDirectory" must be specified", но его уже обсуждали здесь. Должно и мне помочь. 

Руслан, Вам спасибо, что сообщили всем, в чём дело было.

Под каждой статьёй есть две кнопки, можно нажать и в появившееся текстовое поле ввести, чего не хватает статье.

Спасибо, Александр, за указание возможности ввести недостающей информации в статье. Надеюсь таких сюрпризов больше не будет. А если будет, то обязательно дополню статью. В этот раз я написал в техподдержку с просьбой актуализировать статью.

Получается, что параметры командной строки (как минимум, некоторые) также могут быть использованы и в конфиге.

Одна ремарочка - чтобы код работал мне все же приходится принудительно инициализировать переменную "Assembly" с помощью кода: 

FileSystemWorkspaceAssemblyLoader fswal = new FileSystemWorkspaceAssemblyLoader();
userConnection.Workspace.WorkspaceAssembly =  fswal.LoadAssemblyToWorkspace(userConnection.Workspace);

Без этого отваливается с ошибкой: 

 "The "Default" workspace assembly is not initialized"

 

Получается, что параметры командной строки (как минимум, некоторые) также могут быть использованы и в конфиге.

Что вы имеете в виду, Александр? 

Вы посмотрели список параметров командной строки из статьи по ссылке, дописали один из них как параметр в config-файл и заработало.

Не совсем так. Я дописал в командную строку VS, как это описано в академии. В config-файл ни чего не писал. 

Все же интересно, почему переменная "Assembly" не инициализируется при создании объекта (UserConnection), который его содержит. Ответ должен находиться у UserConnection, наверно. Что еще не хватает чтобы все работало гладко?

Когда разработка логики закончится, проверите при обычном использовании внутри системы, вне Visual Studio. Должно будет всё работать и так.

Хорошо. Надеюсь.

Столкнулся с такой же ошибкой.

Помогла замена существующей папки с WorkspaceConsole (\DesktopBin\WorkspaceConsole) на чистую, с дальнейшим развертыванием через PrepareWorkspaceConsole и указания актуальной строки подключения к БД.

 

Правда, имеются некоторые неудобства при отладке: когда добавляю в зависимости сборку Terrasoft.Configuration и использую уже реализованные ранее типы данных, не видно информации о локальных переменных, не работает функционал в окнах отладки "Locals", "Watch", "Immediate".

При попытке, к примеру, получить доступ к какому-либо свойству объекта, получаю ошибку "error CS7069: Reference to type <название типа> claims it is defined in 'Terrasoft.Configuration', but it could not be found".

Если же не использую типы из Terrasoft.Configuration, отладочная информация отображается корректно.

Показать все комментарии