Создайте сборку с помощью access_set safe - PullRequest
2 голосов
/ 29 сентября 2011

Я пытаюсь развернуть сборку .NET в базе данных SQL Server 2008 R2, но я просто нажимаю эту ошибку:

Ошибка развертывания SQL01268: Поставщик данных .Net SqlClient: Msg 6509, Уровень 16, Состояние 31, Строка 1 Произошла ошибка при сборе метаданных из сборки «Сборка» с HRESULT 0x80004005.

Теперь сложность заключается в том, что я убедился, что версия фреймворка верна, и у меня есть отдельный тривиальный проект базы данных CLR, из которого я добавляю и тестирую вещи, чтобы увидеть, могу ли я изолировать проблему (я не могу ). Я даже написал инструмент, который использует Mono.Cecil и PEVerify, чтобы гарантировать, что я придерживаюсь ограничений модели программирования, которые применяются к проектам CLR в базе данных. Я, очевидно, что-то упускаю, но я не знаю, как это отладить, почему SQL Server просто не может сказать мне, почему он не работает?

Не могу ли я что-то сделать, чтобы получить более подробный вывод, почему SQL Server отклоняет сборку?

Ответы [ 2 ]

1 голос
/ 02 октября 2011

Можете ли вы вставить операторы CREATE DDL, пожалуйста?Вы написали заявление CREATE самостоятельно?Похоже, вы использовали автоматическое развертывание из Visual Studio.Попробуйте это вручную.Пожалуйста, дайте подробную информацию о сборке, имеет ли она доступ к внешним данным?

0 голосов
/ 02 октября 2011

После двух дней отладки я так и сделал.

Рисуя из опыта, я использовал Сесил, чтобы переписать сборку, отменив методы, просто заменив все тела методов на просто 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, и, кроме того, этот код фактически разрешен, потому что он не делает ничего, что не разрешено в соответствии с безопасным набором разрешений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...