Как проверить. Net и версии F # Core в целевой системе - PullRequest
1 голос
/ 14 июля 2020

Я написал простой консольный апплет на F #. Он построен на основе. Net Framework 4.5 и F Sharp Core 4.0. Он отлично работает на моей рабочей станции Windows 10. На Windows Server 2016 (версия 1607) выдается

Unhandled Exception: System.TypeInitializationException: инициализатор типа для ' . $ VolLib 'выдал исключение. ---> System.IO.FileLoadException: не удалось загрузить файл или сборку FSharp.Core, Version = 4.3.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Я пробовал замены, предложенные в этом сообщении . Я по-прежнему получаю ту же ошибку.

Я могу установить комплект на сервере (целевой машине). Просто не знаю, что установить.

1 Ответ

1 голос
/ 15 июля 2020

Обычно это проблема привязки, а не проблема структуры. 4.3 - более старая версия.

Скорее всего, версия 4.3 установлена ​​в GA C сервера. Менее вероятно, что каталог bin содержит неправильную версию F #, но вызывающий ошибку метод не вызывается в системе Win10. Проверьте выходной каталог и GA C для версий FSharp.Core.dll, если они верны, проверьте BindingRedirect в app.config.

Если это не помогает найти местоположение и версию неправильно связанная dll, в качестве альтернативы, выгрузите версию сборки Core с typeof<option>.Assembly.GetName().Version как одну из самых ранних в вашем коде (используйте Console.WriteLine, а не printfn). Вы также можете выгрузить фактический путь к расположению сборки таким образом.

Обычно это происходит потому, что ваш код компилируется с библиотекой, которая сама скомпилирована для более старой версии FSharp.Core (например, для экземпляр FParse c, это обычная проблема с этой библиотекой). У меня были случаи, когда затем развертывалась неправильная сборка или правильная, но без BindingRedirect она все равно терпела неудачу.

Если вы хотите знать, какая связанная сборка является виновником, у вас будет чтобы проверить для каждого из них, с какой версией F # они были скомпилированы. Такой инструмент, как Reflector, может помочь. Если вы хотите глубже изучить разрешение загрузки сборки, вы можете использовать инструмент fuslogvw.exe для регистрации событий привязки в реальном времени.

Кстати, вы можете получить текущую версию фреймворка, который вы используете в с System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription

...