Пользователь сообщил следующее сообщение об ошибке:
Failed to resolve T[] modreq(System.Runtime.CompilerServices.IsVolatile)
Это неправильная строка кода:
public static TypeDefinition ResolveTypeReference(this TypeReference typeReference)
{
return typeReference.Resolve() ?? throw new ResolutionException(typeReference);
}
Этот метод вызывается из операндов инструкций с кодами операций OpCodes.Ldfld
или OpCodes.Ldobj
.
ResolutionException
является классом в библиотеке MonoCecil
:
public ResolutionException(MemberReference member)
: base("Failed to resolve " + member.FullName)
{
if (member == null)
throw new ArgumentNullException(nameof (member));
this.member = member;
}
Т.е. значение свойства FullName
нарушающего TypeReference
равно T[] modreq(System.Runtime.CompilerServices.IsVolatile)
.
К сожалению, у меня нет больше трассировки стека, поэтому извините за смутные вопросы:
- В каком сценарии ios свойство
FullName
TypeReference
имеет значение T[] modreq(System.Runtime.CompilerServices.IsVolatile)
? - Является ли его неразрешимость по той же причине, по которой он имеет этот конкретный
Fullname
, или это из-за какой-то другой причины? - Можете ли вы предоставить пример кода C#, который декомпилируется в нечто, имеющее точно это полное имя? Когда я декомпилирую следующий код внутри SharpLab.io ,
public class C<T>
{
public volatile T[] field;
public void M()
{
var temp = field;
}
}
, представляющая интерес инструкция
IL_0004: ldfld !0[] modreq([System.Private.CoreLib]System.Runtime.CompilerServices.IsVolatile) class C`1<!T>::'field'
!0[]
используется для представления универсальный массив c, а не T[]
. Это мотивирует мой первый вопрос.