dnx web на Ubuntu 14.04 выдает исключение System.Runtime.InteropServices.Marshal (1.0.0-beta8)

Я слежу за различными сообщениями в блогах, в которых показано, как взять приложение ASP.NET Core 1.0 (ранее ASP.NET 5), а затем установить правильную среду выполнения .net core для Linux, чтобы вы могли работать в Linux, особенно в Ubuntu 14.04 lts.

У меня установлены основные инструменты .net (dnvm и dnx), и у меня есть приложение ASP.NET, которое является просто стандартным приложением-шаблоном, и я создал репозиторий, содержащий его, и пытаюсь запустить его в своей системе Ubuntu. Последними инструментами .Net и Visual Studio для Windows являются 1.0.0-beta8, и они также есть у меня на моем компьютере с Ubuntu, который сообщает, что установлен Mono-x64-1.0.0-beta8-15858.

Я клонировал свой исходный код в систему Ubuntu и запустил восстановление dnu, которое удалось.

Из папки, содержащей project.json, я запускаю dnx web и получаю следующее:

Application startup exception: System.TypeLoadException: Could not load type 'System.Runtime.InteropServices.Marshal' from assembly 'System.Reflection.Metadata'.
  at System.Reflection.Internal.StreamMemoryBlockProvider.ReadMemoryBlockNoLock (System.IO.Stream stream, Boolean isFileStream, Int64 start, Int32 size) [0x00000] in <filename unknown>:0 
  at System.Reflection.PortableExecutable.PEReader..ctor (System.IO.Stream peStream, PEStreamOptions options, Nullable`1 sizeOpt) [0x00000] in <filename unknown>:0 
  at System.Reflection.PortableExecutable.PEReader..ctor (System.IO.Stream peStream, PEStreamOptions options) [0x00000] in <filename unknown>:0 
  at Microsoft.CodeAnalysis.ModuleMetadata.CreateFromStream (System.IO.Stream peStream, PEStreamOptions options) [0x00000] in <filename unknown>:0 
  at Microsoft.Dnx.Compilation.CSharp.MetadataReferenceExtensions.CreateAssemblyMetadata (IMetadataFileReference fileReference) [0x00000] in <filename unknown>:0 
  at Microsoft.Dnx.Compilation.CSharp.RoslynCompiler+<>c__DisplayClass8_0.<.ctor>b__1 (Microsoft.Dnx.Compilation.Caching.CacheContext ctx) [0x00000] in <filename unknown>:0 
  at Microsoft.Dnx.Compilation.Caching.CacheExtensions+<>c__DisplayClass0_0`1[Microsoft.CodeAnalysis.AssemblyMetadata].<Get>b__0 (Microsoft.Dnx.Compilation.Caching.CacheContext ctx) [0x00000] in <filename unknown>:0 
  at Microsoft.Dnx.Compilation.Caching.Cache.CreateEntry (System.Object k, System.Func`2 acquire) [0x00000] in <filename unknown>:0 
  at Microsoft.Dnx.Compilation.Caching.Cache+<>c__DisplayClass5_0.<AddEntry>b__0 () [0x00000] in <filename unknown>:0 
  at System.Lazy`1[Microsoft.Dnx.Compilation.Caching.Cache+CacheEntry].InitValue () [0x00000] in <filename unknown>:0 

Означает ли это, что существуют конфликтующие версии компонентов, или что-то отсутствует в моей папке .dnx, или что что-то не так в исходном коде моего проекта?

Сначала я увидел еще одно странное исключение, которое, как я думаю, имело какое-то отношение к сборке dnvm "1.0.0-rc2", которая сегодня ненадолго была видна на общедоступных серверах, а затем исчезла.

Некоторые общие шаги настройки:

  1. Проверьте ~/.config/NuGet/NuGet.Config, должно быть так:

.

<configuration>
  <packageSources>
    <add key="AspNetVNext" value="https://www.myget.org/F/aspnetbeta8/api/v2/" />
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packageSources>
  <disabledPackageSources />
</configuration>
  1. Убедитесь, что двоичные файлы dnx, dnu и dnvm присутствуют и обновлены. Убедитесь, что libuv существует и имеет правильную версию. Установите среды выполнения, если они отсутствуют. (Проверьте их с помощью списка dnvm, для установки используйте dnvm install.)

  2. Клонируйте свои источники.

  3. Выберите версию dnx через использование dnvm.

  4. Убедитесь, что ваши пакеты среды выполнения dnx на уровне учетной записи пользователя восстановлены с помощью dnu restore.

  5. ??Что??

  6. Перейдите в папку, содержащую project.json, и запустите dnx web. Успех?

Обновление: если я использую dnvm use 1.0.0-beta8 в Ubuntu 14.04, ошибка времени выполнения dnx web может быть Missing method AllocHGlobal in assembly /home/user/.dnx/runtimes/dnx-mono.1.0.0-beta8/bin/System.Reflection.Metadata.dll, type System.Runtime.InteropServices.Marshal или это может быть System.Runtime.InteropServices.Marshall в заголовке.

Update2: когда у меня было неправильное содержимое в NuGet.Config, я видел некоторые сборки канала разработчика (внутренние невыпущенные).

Текущий вывод списка dnvm:

me@mabox:~$ dnvm list

Active Version              Runtime Architecture OperatingSystem Alias
------ -------              ------- ------------ --------------- -----
       1.0.0-beta7          mono                 linux/osx
  *    1.0.0-beta8          mono                 linux/osx       default

Обновление 3: после того, как я установил целевую среду выполнения coreclr, эта проблема исчезла. После установки список dnvm выглядит так:

Active Version              Runtime Architecture OperatingSystem Alias
------ -------              ------- ------------ --------------- -----
  *    1.0.0-beta8          coreclr x64          linux
       1.0.0-beta8          mono                 linux/osx       default

Обновление 4. Оба ответа ниже содержат важную информацию. Одна ошибка, которую я допустил, заключалась в том, что я предположил, что старые версии mono-2.x, включенные в репозитории apt-get Ubuntu 14.04, приемлемы для использования DNX. Это не так, вместо этого на дату, когда я пишу это, известно, что работают только последние моно-2015.11.xx ночные сборки. В какой-то момент в будущем, когда будет выпущена стабильная версия 4.3.0+, вы, вероятно, будете использовать ее с DNX, но я не могу сказать наверняка.


person Warren P    schedule 12.11.2015    source источник


Ответы (2)


Последними инструментами .Net и Visual Studio для Windows являются 1.0.0-beta8, и они также есть у меня на моем компьютере с Ubuntu, который сообщает, что установлен Mono-x64-1.0.0-beta8-15858.

Мне кажется, что вы не работаете с одной и той же средой выполнения.

Пробовали ли вы запускать dnvm upgrade без ночного сервера сборки? Мне кажется, что ваш код может использовать сборки beta8 в среде выполнения beta8-15858.

Запустите dnu feeds list на своем компьютере с Ubuntu, чтобы убедиться, что вы нацелены на стабильный канал, а не на канал разработчиков (должен быть виден только канал по умолчанию).

Если вы выбрали не тот фид, вы можете изменить его в файле nuget.config, расположенном в папке пользователя в разделе ~/.config/NuGet/Nuget.Config.

Выполните следующие действия, чтобы убедиться, что вы находитесь в правильной среде выполнения:

  • Удалите все существующие среды выполнения в ~/.dnx/runtimes
  • dnvm upgrade
  • dnvm install -r coreclr latest
  • Затем запустите dnu restore в своем проекте.
  • dnx web теперь должно работать
person Maxime Rouiller    schedule 12.11.2015
comment
Вам нужно будет поговорить с командой ASP.NET об этом последнем пункте: P Я уверен, что фид aspnetvnext не тот. Это ночная сборка. - person Maxime Rouiller; 12.11.2015
comment
Обновлен мой ответ, чтобы включить фид: myget.org/F/aspnetbeta8/api/v2 / myget.org/F/aspnetbeta8/api/v3/ index.json - person Maxime Rouiller; 12.11.2015
comment
Вы пытались запустить версию CoreClr вместо моно? CoreClr явно поддерживает Ubuntu. - person Maxime Rouiller; 12.11.2015
comment
переформатировал мой ответ, чтобы он был более линейным и простым для понимания. меньше стены текста - person Maxime Rouiller; 12.11.2015
comment
Странный факт: dnu feeds list сейчас у меня работает, а десять минут назад не работало. Установка среды выполнения coreclr также изменила возможности dnu. Я подозреваю, что версия dnu для среды выполнения mono в 1.0.0-beta8 полностью переработана. Версия dnu, в которой нет dnu feeds list, является хорошим признаком того, что это плохой dnu. тем не менее, dnu сообщает, что его тип - Mono, когда я запускаю dnu --version - person Warren P; 12.11.2015
comment
Вам не нужны эти каналы. бета-версия 8 была выпущена и доступна на сайте nuget.org. - person Stafford Williams; 13.11.2015
comment
@StaffordWilliams исправлено. - person Maxime Rouiller; 13.11.2015

Можно запустить beta8 против моно на Ubuntu 14.04. Я только что попробовал и добился успеха, вот шаги, которые я выполнил;

  1. Установил dnvm и libuv в соответствии с инструкциями здесь .

  2. Побежал dnvm install 1.0.0-beta8

  3. Установлен mono-snapshot-latest и выполнен . mono-snapshot mono

  4. Клонировал этот новый проект MVC 6 beta8 git clone https://github.com/staff0rd/TinyMvc -b beta8

  5. Выполнил mozroots --import --sync, поэтому nuget не генерирует исключения TrustFailure

  6. Выполнены cd TinyMvc и dnu restore

  7. Выполнить dnx web;

Результат:

[mono-2015.11.13+00.47.00]root@8792d900344b:/TinyMvc# dnx web
Hosting environment: Production
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Выполняется на пустой Ubuntu 14.04 из здесь.

person Stafford Williams    schedule 13.11.2015
comment
Я использовал не последний снимок mono, а скорее уже устаревшую libmono-2.x, поставляемую с Ubuntu 14.04 LTS. После добавления этого репозитория в мои источники apt и его установки mono --version сообщает о гораздо более респектабельном Mono Jit compiler 3.2.8 (debian 3.2.8+.... - это, безусловно, объясняет сбои при запуске на низком уровне. :-) - person Warren P; 13.11.2015
comment
Когда я запускаю dnvm use 1.0.0-beta8, мне все равно нужно запускать . mono-snapshot mono, иначе я получу ошибку запуска (не удалось загрузить файл или сборку system.runtime). Я предполагаю, что использование dnvm не может устранить это требование. Эта команда из-за точечного синтаксиса (.mono-snapshot mono) импортирует данные в мое состояние сеанса bash, устанавливая переменные среды, необходимые для моно, и, возможно, обновляя пути, чтобы найти основные DLL-файлы среды выполнения моно? - person Warren P; 13.11.2015
comment
Поучительно указать другим новичкам, таким как я, что dnvm install НЕ устанавливает сам Mono, а скорее какие-то крючки и леса Mono, таким образом, приведенные выше инструкции. - person Warren P; 13.11.2015