Сообщение TypeLoadException неверно?

У меня есть интересный случай, который ни я, ни мои коллеги не можем понять. Мы разработали плагин для стороннего программного обеспечения (Autodesk Revit 2018) в.NET C#. И наш плагин, и хост-приложение (Revit) используют сборку под названием Xceed.AvalonDock.dll, но с разными версиями. Наш плагин использует версию 3.2.0, Revit использует 2.0.0.

На некоторых клиентских компьютерах запуск нашего приложения завершается неудачей из-за следующей исключительной ситуации TypeLoadException:

System.TypeLoadException
GenericArguments[0], 'Xceed.Wpf.AvalonDock.Layout.ILayoutPanelElement', on 'Xceed.Wpf.AvalonDock.Layout.LayoutGroup`1[T]' violates the constraint of type parameter 'T'.
   at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.Instantiate(Type[] inst)
   at System.RuntimeType.MakeGenericType(Type[] instantiation)

Наш проект ссылается на Xceed следующим образом (скопировано из нашего файла.vcsproj):

<Reference Include="Xceed.Wpf.AvalonDock, Version=3.2.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL">
  <HintPath>..\..\..\..\packages\Extended.Wpf.Toolkit.3.2.0\lib\net40\Xceed.Wpf.AvalonDock.dll</HintPath>
  <Private>True</Private>
</Reference>

Ясно, что мы указываем точную версию DLL (и даже токен открытого ключа). Я проверил на своей машине, и хотя Revit загружает версию dll 2.0 (которая ему нужна), наш плагин загружает версию 3.2 при запуске.

Меня удивляет то, что сообщение об ошибке исключения кажется неправильным. Зачем? Посмотрите на объявление LayoutGroup<>:

[Serializable]
public abstract class LayoutGroup<T> : LayoutGroupBase ... where T : class, ILayoutElement

В сообщении говорится, что ILayoutPanelElement не удовлетворяет предложению where. Это подтип ILayoutElement, и все его подтипы являются ссылочными типами (даже если бы они были структурами, я думаю, об этом позаботился бы автоматический бокс). Так что, очевидно, это удовлетворяет условию where, не так ли?

Что может вызвать такое исключение? Является ли сообщение красной селедкой? Может ли быть так, что каким-то образом на клиентском компьютере запутывается версия DLL? Если так, то почему это не делается на нашей машине (машинах). Я протестировал на Windows 7 и 10, и не могу воспроизвести это исключение.

Если у кого-нибудь есть идея, пожалуйста, помогите!

ОБНОВЛЕНИЕ: AvalonDock с открытым исходным кодом. Я проверил обе ревизии (версии 2.0 и 3.2) для объявления LayoutGroup, ILayoutElement и ILayoutPanelElement, и сообщение об исключении все еще кажется мне неправильным. В этой части кода мало что изменилось.

0 ответов

Другие вопросы по тегам