У нас есть веб-роль 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.
Любые советы будут с благодарностью приняты.
Спасибо, Сэм