Я слежу за различными сообщениями в блогах, в которых показано, как взять приложение 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", которая сегодня ненадолго была видна на общедоступных серверах, а затем исчезла.
Некоторые общие шаги настройки:
- Проверьте ~/.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>
Убедитесь, что двоичные файлы dnx, dnu и dnvm присутствуют и обновлены. Убедитесь, что libuv существует и имеет правильную версию. Установите среды выполнения, если они отсутствуют. (Проверьте их с помощью списка dnvm, для установки используйте dnvm install.)
Клонируйте свои источники.
Выберите версию dnx через использование dnvm.
Убедитесь, что ваши пакеты среды выполнения dnx на уровне учетной записи пользователя восстановлены с помощью dnu restore.
??Что??
Перейдите в папку, содержащую 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, но я не могу сказать наверняка.