在Ubuntu 14.04上的dnx网站抛出“System.Runtime.InteropServices.Marshal”exception(1.0.0-beta8)

我正在关注各种博客文章,介绍如何使用ASP.NET Core 1.0应用程序(以前称为ASP.NET 5),然后为Linux安装正确的.net核心运行时,因此您可以在Linux上运行,特别是在ubuntu 14.04上运行。

我已经安装了.net核心工具(dnvm和dnx),并且我有一个只是标准模板应用程序的ASP.NET应用程序,而且我创build了一个包含它的存储库,并试图在我的Ubuntu系统上运行它。 Windows上最新的.Net和Visual Studio工具是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文件夹中存在组件冲突版本或缺less某些内容,或者在我的项目源代码中存在错误?

起初,我看到另外一个奇怪的例外,我认为这个例外与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. 通过dnvm useselect一个dnx版本。

  4. 确保您的用户帐户级别的dnx运行时软件包通过dnu恢复进行恢复。

  5. ??什么??

  6. 转到包含project.json的文件夹并运行dnx web 。 成功?

更新:如果我使用dnvm在ubuntu 14.04上使用1.0.0-beta8,则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中有错误的内容时,我看到一些开发人员频道(内部未发布)构build。

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目标运行时types,这个问题就消失了。 一旦安装,dnvm列表如下所示:

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

更新4:以下两个答案都包含重要信息。 我犯的一个错误是假定包含在Ubuntu 14.04的apt-get版本中的古老的mono-2.x版本可以被DNX使用。 他们不是,而是我写这个date,只有最近的mono-2015.11.xx每晚构build已知的工作。 在未来的某个时候,一旦稳定的4.3.0+版本发布,你可能会使用DNX,但我不能肯定地说。

Windows上最新的.Net和Visual Studio工具是1.0.0-beta8,在我的Ubuntu机器上也是这样,它报告Mono-x64-1.0.0-beta8-15858被安装。

对我来说,你似乎没有运行相同的运行时间。

您是否尝试过运行dnvm upgrade而无需定位夜间构建服务器? 在我看来,您的代码可能在beta8-15858运行时使用beta8程序集。

在你的Ubuntu机器上运行dnu feeds list ,以确保你的目标是稳定的频道,而不是开发者(应该只看到默认的提要)。

如果您的目标是错误的,您可以从位于~/.config/NuGet/Nuget.Config下的用户文件夹中的nuget.config文件中进行~/.config/NuGet/Nuget.Config

执行以下操作以确保您处于正确的运行时间:

  • 删除~/.dnx/runtimes所有现有运行~/.dnx/runtimes
  • dnvm upgrade
  • dnvm install -r coreclr latest
  • 然后在你的项目上运行dnu restore
  • dnx web现在应该工作

有可能在ubuntu 14.04上运行beta8单声道。 我刚刚给了它一个镜头,并取得了成功,这是我遵循的步骤;

  1. 按照这里的说明安装dnvm和libuv。

  2. dnvm install 1.0.0-beta8

  3. 安装单张快照 – 最新并执行. mono-snapshot mono . mono-snapshot mono

  4. 克隆这个新的MVC 6 beta8项目git clone https://github.com/staff0rd/TinyMvc -b beta8

  5. Ran mozroots --import --sync so nuget不会抛出TrustFailure异常

  6. 执行cd TinyMvcdnu 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。