Имеем, некоторый набор классов с интерфейсами
- Код: Выделить всё
Public Interface IObject
Property Id As Integer
Property Id_Parent As Integer
Property Name As String
Property Info As String
Property Thumbnail As BitmapImage
Function Represent(ByRef Context As IContext(Of IObject)) As IGraphics(Of IObject)
End Interface
Public Interface IContext(Of T)
Function Attach(ByRef Item As T) As IGraphics(Of T)
Sub Detach(ByRef Graphics As IGraphics(Of T))
End Interface
Public Class TreeObjectContext(Of IObject) : Implements IContext(Of IObject)
Private TreeView As TreeView
Public Sub New(ByRef TreeView As TreeView)
'...
End Sub
Public Function Attach(ByRef Item As IObject) As IGraphics(Of IObject) Implements IContext(Of IObject).Attach
'...
End Function
Public Sub Detach(ByRef Graphics As IGraphics(Of IObject)) Implements IContext(Of IObject).Detach
'...
End Sub
End Class
<Serializable()>
Public Class [Class] : Implements ISerializable, IObject
Public Property Id As Integer Implements IObject.Id
Public Property Id_Parent As Integer Implements IObject.Id_Parent
Public Property Name As String Implements IObject.Name
Public Property Info As String Implements IObject.Info
Public Property Thumbnail As BitmapImage Implements IObject.Thumbnail
Public Sub New()
End Sub
Private Sub New(ByVal Info As SerializationInfo, ByVal Context As StreamingContext)
'...
End Sub
Public Sub GetObjectData(ByVal Info As SerializationInfo, ByVal Context As StreamingContext) Implements ISerializable.GetObjectData
'...
End Sub
Public Function Represent(ByRef Context As IContext(Of IObject)) As IGraphics(Of IObject) Implements IObject.Represent
'...
End Function
End Class
При вызове
- Код: Выделить всё
Dim TreeObjectContext As IContext(Of IObject) = New TreeObjectContext(Of IObject)(New TreeView)
Dim [Class] As IObject = New Class With {.Id_Parent = 0}
[Class].Represent(TreeObjectContext)
В ходе работы кода, вылетеет MissingMethodException на строке [Class].Represent(TreeObjectContext) c сообщением Method not found: 'IGraphics`1<IObject>[Class].Represent(IContext`1<IObject> ByRef)'
Хотя ни компилятор, ни редактор не показывал никакой ошибки. Так же исходя из кода, очевидно, что метод класса присутствует.
Симптомы:
Вылетает MissingMethodException, обычно при приведении типов к параметрам функции, так же возможен Exception на простом обращении к функциям класса
Возможные причины:
* Точные причины - не известны
* Предположение - повреждение/порча оптимизатором IL кода.
* Зависший процесс [проект].vshost.exe
Возможное устранение:
* VB: В Project -> Properties -> Advanced - > Advanced Compile Options убрать галочку с Enable optimization
* C#: В Project -> Properties -> Build убрать галочку с Otimize code
По умолчанию оптимизация - Выключена
* Закрыть VS, Убить процесс [проект].vshost.exe
Статус:
В ходе исследования
Выявлено в:
* Visual Basic 2010 + .NET Framework 4.0
Дополнительная информация:
* Описание MissingMethodException
* Мой топик на msdn (В предпосылках приведён аналогичный код, с отличием в том, что убраны неймспейсы для краткости кода)
* Найденная на мсдн схожая ситуация
* Статья о ключе оптимизации (перевод)