dnx web on ubuntu 14.04 throws" System.Runtime.InteropServices.Marshal"异常(1.0.0-beta8)

时间:2015-11-12 16:07:06

标签: ubuntu visual-studio-2015 asp.net-core dnx

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

我安装了.net核心工具(dnvm和dnx),我有一个ASP.NET应用程序,它只是标准模板应用程序,我创建了一个包含它的存储库,并且我试图在我的网站上运行它Ubuntu系统。 Windows上最新的.Net和Visual Studio工具是1.0.0-beta8,我也在我的ubuntu盒子上,它报告了Mono-x64-1.0.0-beta8-15858被安装。

我将我的源代码克隆到ubuntu系统上并运行了dnu restore,后者成功了。

从包含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文件夹中存在冲突版本的组件或缺少某些内容,或者我的项目源代码中有错误?

起初我看到了另一个奇怪的异常,我认为这与#34; 1.0.0-rc2&#34;有关。今天在公共服务器上短暂可见的dnvm的构建,然后消失了。

一些常规设置步骤:

  1. 检查〜/ .config / NuGet / NuGet.Config,它应该是这样的:
  2. 。     

    <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选择dnx版本。

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

    5. ??什么?

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

    7. 更新:如果我在ubuntu 14.04上使用dnvm使用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中输入了错误的内容时,我看到了一些开发人员频道(内部未发布的)版本。

      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:以下两个答案都包含重要信息。我犯的一个错误是假设包含在Ubuntu 14.04的apt-get存储库中的古代mono-2.x版本可以接受DNX使用。它们不是,而是在我写这篇文章的日期,只有最近的单声道2015.11.xx夜间版本才有效。在未来的某个时候,一旦发布稳定的4.3.0+版本,您可能会使用DNX,但我无法肯定地说。

2 个答案:

答案 0 :(得分:2)

  

Windows上最新的.Net和Visual Studio工具是1.0.0-beta8,   我也在我的ubuntu盒子上报告了这一点   安装了Mono-x64-1.0.0-beta8-15858。

对我而言,似乎您没有针对相同的运行时运行。

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

在您的Ubuntu框中运行dnu feeds list以确保您定位的是稳定渠道,而不是开发人员渠道(应该只看到默认Feed)。

如果您定位错误的Feed,则可以从位于nuget.config下的用户文件夹中的~/.config/NuGet/Nuget.Config文件进行更改。

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

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

答案 1 :(得分:1)

可以在ubuntu 14.04上针对mono运行beta8。我只是试一试并取得了成功,这是我遵循的步骤;

  1. 按照here的说明安装了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 doesn't throw TrustFailure例外

  6. 已执行cd TinyMvcdnu restore

  7. 运行dnx web;

  8. 结果:

    [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.
    

    here对空的Ubuntu 14.04执行。