Как отладить моно во время выполнения, вызывая, казалось бы, случайный метод получения вместо метода интерфейса - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть проблема, вызванная моно-средой выполнения, вызывающей, казалось бы, случайный метод получения вместо метода интерфейса.

Я сузил ядро ​​до:

IGraphElementEditorData test = provider.CreateEditorData();

if (!typeof(IGraphElementEditorData).IsAssignableFrom(test))
{
    Debug.LogWarning("Please don't get logged.");
}

К сожалению, он регистрируется:

The log

Очевидно, среда выполнения делает что-то не так, нарушая безопасность типов.

Программа работает в среде Unity Mono 2.X.

Исследуя далее, я обнаружил, что provider.CreateEditorData() фактически вызывает совершенно другой метод для самого провайдера: он вызывает метод получения provider.source, который даже не совместим по типу:

0x0000000031E8E84B (Mono JIT Code) Bolt.InvalidConnection:get_source ()
0x000000003493D53F (Mono JIT Code) Bolt.UnitConnection`2<object, object>:Ludiq.IConnection<Bolt.IUnitOutputPort,Bolt.IUnitInputPort>.get_source ()
0x00000000321F719A (Mono JIT Code) Ludiq.GraphPointer:GetElementEditorData<object> (Ludiq.IGraphElementEditorDataProvider)

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

Я спрашиваю как мне подойти к отладке? Это первый раз, когда я сталкиваюсь с подобной проблемой, и я недостаточно знаком с терминологией времени выполнения Mono, чтобы даже начать поиск. Из того, что я понимаю, кажется, что это может быть проблема с виртуальной таблицей (vtable) указателей методов, но я не могу найти сообщение об ошибке в программном обеспечении отслеживания Mono, которое соответствует моей проблеме.

1 Ответ

0 голосов
/ 27 апреля 2018

IsAssignableFrom принимает параметр Type . Объект, который вы передаете, является объектом типа IGraphElementEditorData, который не a Type (и не может быть 1 ), который должен быть выброшен ошибка компилятора "невозможно преобразовать IGraphElementEditorData в тип"

Что вы, вероятно, ищете:

IGraphElementEditorData test = provider.CreateEditorData();

if (!typeof(IGraphElementEditorData).IsAssignableFrom(test.GetType()))
{
    Debug.LogWarning("Please don't get logged.");
}

В любом случае, когда я запускаю этот код, я не получаю сообщение регистрации.

1 Интерфейсы не могут расширять классы.

...