ServiceStack TypeLoadException - Неизвестный источник

Немного предыстории: недавно я перекомпилировал библиотеку ServiceStack из ее исходного кода (https://github.com/ServiceStack/ServiceStack). Я также перекомпилировал проект ServiceStack.Text после исправления некоторых ошибок. Я скопировал dll-файл ServiceStack.Text в папку «lib» проекта ServiceStack (он там, потому что решение ServiceStack не включает сериализаторы в тексте).

Теперь я получаю TypeLoadExceptions, как показано ниже:

System.TypeLoadException: метод get_StatusCode в типе ServiceStack.ServiceInterface.Testing.MockHttpResponse из сборки ServiceStack.ServiceInterface, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null не имеет реализации. в System.Reflection.RuntimeAssembly.GetExportedTypes (сборка RuntimeAssembly, ObjectHandleOnStack retTypes) в System.Reflection.RuntimeAssembly.GetExportedTypes () в ---- мой код отсюда ...----

Я не уверен, в чем может быть проблема. Я подозревал, что это может быть проблема с циклической ссылкой на DLL (DLL Hell), потому что имеется ссылка на ServiceStack.OrmLite (которая также ссылается на другие решения в этом проекте); однако после удаления всех ссылок на проекты ServiceStack я все еще не решил проблему.

В этом сообщении, кажется, есть некоторые идеи, но мне не удалось их реализовать: TypeLoadException сообщает" нет реализации ", но реализовано


person theMayer    schedule 14.03.2013    source источник


Ответы (1)


Вы используете грязные библиотеки DLL для различных версий компонентов ServiceStack, которые все должны синхронизироваться.

В сборке каждой основной библиотеки DLL компонента ServiceStack помечен номер версии, он соответствует версии, развернутой в NuGet, например последняя версия ServiceStack - v3.9.38, убедитесь, что вы используете по крайней мере v3.9.38 всех остальных библиотек.

Основная матрица зависимостей ServiceStack выглядит так:

ServiceStack.Text
  +
  > ServiceStack.Interfaces
  > ServiceStack.Common
      + 
      > ServiceStack.Redis
      > ServiceStack.OrmLite
          +
          > ServiceStack
              +
              > ServiceStack.ServiceInterface

Если вы используете v3.9.38 ServiceStack.dll, вы хотите убедиться, что все подкомпоненты выше ServiceStack имеют версию не ниже v3.9.38.

person mythz    schedule 14.03.2013
comment
Как предотвратить эту проблему при их создании? Я не хочу создавать каждый проект и копировать каждую dll, мне нужны только те, которые я использую ... - person theMayer; 15.03.2013
comment
Если вы хотите строить из исходного кода, вам необходимо убедиться, что зависимые компоненты распространяются должным образом. Если вы клонируете репозитории в c:\src, вы можете использовать сценарии build.bat внутри /build папки каждого основного решения, которое автоматически копирует DLL-файлы выпуска в нужные каталоги, например в ServiceStack / lib. - person mythz; 15.03.2013
comment
Похоже, это не решает проблему. Я удалил все ссылки на ServiceStack.OrmLite (и dll в папке / lib) и перестроил решение, включив проект ServiceStack.Text (так что все ссылки компилировались в VisualStudio). Я очистил все папки bin и obj с помощью Git Cleanup. Я также стер все кеши Visual Studio. Если есть грязные библиотеки DLL, я понятия не имею, откуда они берутся. - person theMayer; 15.03.2013
comment
Убедитесь, что вы работаете в режиме Release для всех проектов (который должен быть по умолчанию). Кроме того, я не знаю, что вам сказать, я так развиваюсь каждый день. Я просто сначала перестраиваю все зависимые проекты (начиная сверху), запускаю каждый из скриптов build.bat, а не RebuildAll из ServiceStack. - person mythz; 15.03.2013
comment
Я просто подозреваю, что это неплохая проблема с DLL, что на самом деле происходит что-то еще. Я просто не знаю, что это такое. - person theMayer; 15.03.2013
comment
Совершенно очевидно, что это такое, одна DLL думает, что MockHttpResponse имеет свойство Status, в то время как фактическая реализация, которая используется, нет. В данном случае это ваш ServiceStack.ServiceInterface.dll старый. - person mythz; 15.03.2013
comment
Я дошел до того, что единственными строящимися проектами являются SS, SS.Text, SS.Common, SS.Interfaces и SS.ServiceInterface. Я только что заметил, что проекты ссылаются на отладочную версию SS.Text, поэтому я посмотрю, исправит ли это это. - person theMayer; 15.03.2013
comment
позвольте нам продолжить обсуждение в чате - person theMayer; 15.03.2013