Что мне нужно
Шаг 1
Мне нужно сделать экспорт всей информации, независимо от типа узла, под основнойкорневой узел (= пакет).
Шаг 2
Используя эту информацию об экспорте, мне нужно сопоставить контракт JSON, предоставленный третьей стороной.
Шаг 3
Затем третья сторона может использовать мой JSON для импорта информации из EA в свою систему.
Что у меня есть
Шаг 1 завершен, у меня есть файл данных на моем целевом местоположении, например:
![enter image description here](https://i.stack.imgur.com/QhKbX.png)
По сути, это статическийhtml сайт, который соответствует структуре советника путем отображения информации в древовидном представлении, аналогично тому, как вы видите ее в EA.
Что я могу сделать
перейдите в папку EARoot и прочитайте всю информацию, представленную в html-файлах, которые там находятся.
В моем случае EARoot содержит три подпапки:
Где подпапки EA1 содержат
- EA1
- EA2
- EA1.html
- EA2.html
- EA3.html
HTML-файлы содержат необходимую информацию, которую можно интерпретироватьданные осмысленно.
Подвох
В том, что в EA нет прямой ссылки на файлы и фактическую структуру узлов.Я могу сделать предположение на основе доступных данных, которые будут работать в большинстве случаев, но они должны быть надежными и работать в любое время.
Я могу найти правильный UUID в каждом htmlфайл, так что это будет способ ссылки на структуру, но чтобы найти эту структуру, мне нужно иметь возможность получить UUIDS всех дочерних узлов и рекурсивно пройти по дереву.
Я пыталсяследующее:
public Package GetRootPackage()
{
using (var repo = EnterpriseArchitect.Repository.Open(_connectionString))
{
return repo.GetPackage(this.RootPackageName);
}
}
EnterpriseArchitect.Repository - это оболочка поверх EA.Repository, позволяющая сделать его IDisposable для лучшего управления соединением.
Использование метода GetRootPackageопределенный выше, я могу подключиться и загрузить нужный мне узел:
var root = MyBuilder.ConnectTo(myConnectionString)
.RootPackage(rootNodeName)
.GetRootPackage();
Я думаю, что тогда я смог бы получить его потомки вот так:
var children = root.Packages;
Нозатем я получаю эту неприятную ошибку:
System.Runtime.InteropServices.COMException HResult = 0x80010105
Сообщение = Сервер выдал исключение.(Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) Source = my.console
StackTrace: в EA.IDualPackage.get_Elements () в my.console.Program.Main (String [] args) в C: \ Repos \ my.console \ Program.cs: строка 29
Я проверил EventViewer для получения дополнительной информации и нашел (только) это:
Faulting application name: EA.exe, version: 14.1.0.1427, time stamp: 0x5b9718a5
Faulting module name: EA.exe, version: 14.1.0.1427, time stamp: 0x5b9718a5
Exception code: 0xc0000005
Fault offset: 0x0049ffc4
Faulting process id: 0x2eac
Faulting application start time: 0x01d56eb6d931a965
Faulting application path: C:\Program Files (x86)\Sparx Systems\EA\EA.exe
Faulting module path: C:\Program Files (x86)\Sparx Systems\EA\EA.exe
Report Id: 223f8c89-c84a-45c6-9100-82af8e94643a
Faulting package full name:
Faulting package-relative application ID:
Вопрос
То, что я нахожу относительно этого HResult=0x80010105
, похоже, связано с Excel, поэтому я не уверен, имеет ли это смысл.
Я бегу из консоли, потому что я понял, что interop.EA
должно бытьсчитается не поточно-безопасным.
Что я могу сделать, чтобы избежать этой проблемы и получить дочерние пакеты?