Исключения в F # при работе на Azure - PullRequest
0 голосов
/ 09 ноября 2011

У нас есть веб-роль C #, работающая в Azure, и проект C # вызывает код в F # dll, который мы развертываем с нашим приложением.

Когда мы работаем локально, используя локальный эмулятор Azure, наш код F # вызывается и работает нормально.Когда он работает в Azure в облаке, наш код F # завершается с ошибкой в ​​определенный момент, за исключением:

Не удалось проанализировать функцию x: var (2) .Exception: System.IO.FileNotFoundException: Couldне загружать файл или сборку 'FSharp.Core, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' или одну из ее зависимостей.Система не может найти указанный файл.Имя файла: 'FSharp.Core, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a'
в Microsoft.FSharp.Text.Lexing.LexBuffer 1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer 1.FromString (String s) в Marshal.vars @27.GenerateNext (IEnumerable`1 & next)
WRN: регистрация привязки сборки отключена.Чтобы включить ведение журнала ошибок привязки сборки, установите для параметра реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) значение 1. Примечание. С журналированием ошибок привязки сборки связано некоторое снижение производительности.Чтобы отключить эту функцию, удалите значение реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog]..Будем использовать функцию по умолчанию.

Мы нашли несколько публикаций, в которых это объясняется тем, что:

Windows Azure запускает приложения с частичным доверием, как часть их песочницы.Однако основные библиотеки F # в настоящее время установлены в GAC, но не имеют атрибута AllowPartialTrustedCallers.Поэтому при создании приложений F # для запуска в Azure библиотеки F # должны быть статически связаны с использованием --standalone.Предоставленные шаблоны позаботятся об этом, но вы заметите следующие побочные эффекты: • Дольше, чем обычно, время компиляции • Большой набор ссылок • Фиктивная ссылка на «RDManaged.dll»

http://archive.msdn.microsoft.com/fsharpazure

Чтобы попытаться обойти это, мы следуем приведенному ниже совету и устанавливаем флаг –standalone в конфигурации сборки нашей библиотеки F #.

http://www.42spikes.com/post/F-and-Azure.aspx

Однако библиотека F # не компилируется с этим флагом.Мы получаем эту ошибку сборки:

Ошибка 3 Возникла проблема при записи двоичного файла 'obj \ Debug \ Analyzer.dll': ошибка в pass2 для типа Microsoft.FSharp.Text.StructuredFormat.Joint, ошибка:Один из ваших модулей ожидает, что тип 'System.Collections.IStructuralEquatable' будет определен в пределах излучаемого модуля.Возможно, вам не хватает входного файла FSC 1 1
Analyzer

Может ли эта ошибка сборки быть из-за зависимостей нашего F # проекта?Он ссылается на FSharp.PowerPack.dll и Microsoft.Z3.dll, а также на другую библиотеку C # в нашем решении, AnalyzerCommon.dll (которая просто содержит общий интерфейс, который реализуют как наши коды F #, так и C #).

Интересно, что код F # вызывается и работает нормально, он работает только до тех пор, пока не достигнет определенной части кода - синтаксического анализатора формул, использующего FSharp.PowerPack.dll.

Любые советы будут с благодарностью приняты.

Спасибо, Сэм

1 Ответ

3 голосов
/ 09 ноября 2011

Вы должны явно указать все необходимые сборки в приложении WebRole и установить для атрибута " Copy Local " значение " True ".Проверьте это мое сообщение в блоге .Самое первое, что я упомянул - это Copy Local.

Причина, по которой часть вашего кода выполняется, а другая нет, - это JIT-компилятор.Все работает нормально, пока вы не нажмете код, который требует отсутствующей сборки.Если у вас есть все необходимые сборки, явно добавленные в качестве ссылки, и для параметра «Копировать локальный» установлено значение «Истина», исключение «Файл не найден» не будет.

Пожалуйста, следите, если это помогло!

РЕДАКТИРОВАТЬ

Windows Azure по умолчанию работает в режиме полного доверия.С SDK 1.3 я думаю.Вы можете изменить это, щелкнув правой кнопкой мыши свою веб-роль в проекте Cloud в Visual Studio Solution, выберите «Свойства», перейдите к «Конфигурация» и выберите «Полное доверие».

...