После двух дней отладки я так и сделал.
Рисуя из опыта, я использовал Сесил, чтобы переписать сборку, отменив методы, просто заменив все тела методов на просто throw new NotImplementedException
, игнорируя все конструкторы (инициализация немного сложна и не может просто убить тело методаконструктора).После этого сборка была успешно установлена.Я не знал, в чем проблема, но я знал, что это как-то связано с кодом.Это было мое предположение все время.
Чтобы найти реальный метод, я использовал бинарный поиск.Я заменил половину методов в сборке, и если ошибки не было, я пошел налево, в противном случае вправо, пока у меня была проблема, пока я не нашел наименьший набор методов, которые были ответственны за ошибку.Учитывая, что это было более 2000 методов, и мне потребовалось около 1-2 секунд для тестирования каждой конфигурации, это сэкономило много времени.
Мне удалось довольно просто обнулить один метод, и вот оно (из того, что я мог бы сказать о своих выводах, это должно быть и в общем классе).
class Hashtable<K, V>
{
IEnumerable<KeyValuePair<K, V>> GetEnumerator()
{
var hashtable = new Hashtable();
return hashtable
.Cast<DictionaryEntry>()
.Select(x => new KeyValuePair<K, V>((K)x.Key, (V)x.Value))
.GetEnumerator();
}
}
Ничто в этом коде на самом деле не приводит к тому, что любой IL является недопустимым, даже если существует множество преобразований, примененныхкомпилятор.Если вы поместите это в сборку CLR базы данных, она отклонит сборку с ошибкой access denied
без какой-либо дополнительной информации.
В конце концов, я собираюсь сообщить об этом в Microsoft как об ошибке, сообщение об ошибке должноне быть access denied
, и, кроме того, этот код фактически разрешен, потому что он не делает ничего, что не разрешено в соответствии с безопасным набором разрешений.