Я вызываю некоторый код VB.NET в одной сборке из кода C # в другой сборке. Код строится нормально, но я получаю MissingMethodException
, когда я звоню.
Обычно, согласно прочитанному Stack Overflow и результатам поиска Google для MethodMissingException
, которые я прочитал, это происходит из-за несоответствия между библиотеками DLL, с которыми вы работаете, и библиотеками, с которыми вы работаете. Ни один из результатов не упоминает третью DLL. Подробнее об этом ниже.
Я подтвердил, что:
- Путь целевой DLL совпадает с путем ссылки, в соответствии с окном вывода VS2008 при отладке
- Это единственная версия целевой DLL, загруженная в систему, согласно ProcExp
- «Отсутствующий» метод присутствует в соответствии с кодом
- «Отсутствующий» метод присутствует в соответствии с сгенерированной XML-документацией
- «Отсутствующий» метод присутствует в соответствии с рефлектором
Самое сильное преимущество - это дублирующая загрузка сборки, содержащей тип, используемый в сигнатуре «отсутствующего» метода. Это происходит как от SecondParty
(на который я ссылаюсь), так и от FirstParty
(с отключенным локальным копированием).
Ручное копирование всего в новый каталог устраняет проблему. Это затрудняет отладку: мне нравится просто нажимать на зеленый треугольник.
Деталь:
У меня третья сборка со строго типизированным набором данных ADO.NET. Давайте назовем тип ThirdParty.PortableData
. Мой FirstParty
заполняет его данными и передает его SecondParty
.
вызывающий код в FirstParty
, который не работает, выглядит примерно так:
ThirdParty.PortableData data = GetPortableData()
SecondParty instance = new SecondParty()
instance.Data = data
(MissingMethodException
выбрасывается из строки, которая вызывает метод с этим кодом в нем.)
Целевой код в SecondParty
, который FirstParty
не может найти во время выполнения, выглядит следующим образом:
Public Property Data() As ThirdParty.PortableData
Get
' ...
End Get
Set(ByVal value As ThirdParty.PortableData)
' ...
End Set
End Property
Я тоже пробовал, с немного другим кодом вызова:
Public Sub SetData(ByVal value as ThirdParty.PortableData)
' ...
End Sub
DLL-библиотека ThirdParty
загружается из более чем одного места, в соответствии с VS2008 и ProcExp - один раз из ссылочного пути и один раз из каталога сборки. MD5 дайджесты DLL совпадают.
Если я скопирую все в новый каталог, при условии, что есть только одна копия ThirdParty
DLL, программа будет работать нормально.
У всех ссылок на ThirdParty
функция «Копировать локально» отключена. И все же копия находится в FirstParty\bin\Debug
.
Что еще я должен проверить? Как можно предотвратить MissingMethodException
во время отладки, кроме сценариев после сборки, которые копируют продукты для сборки?