2015-11-12 66 views
2

我下面的各種博客文章展示瞭如何把一個ASP.NET 1.0的核心應用(以前ASP.NET 5)然後爲Linux安裝正確的.net核心運行時,所以你可以在Linux上運行,特別是在Ubuntu 14.04上運行。DNX網站拋出「System.Runtime.InteropServices.Marshal」異常(1.0.0-beta8)

我安裝了.net核心工具(dnvm和dnx),並且我有一個ASP.NET應用程序,它只是標準的模板應用程序,並且我創建了一個包含它的存儲庫,並且試圖運行它我的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文件夾,或出現我的項目源代碼中出現錯誤?

起初我看到另外一個奇怪的例外,我認爲這個例外與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使用DNX版本。

  4. 確保通過DNU恢復您的用戶帳戶級別DNX運行時包被恢復。

  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中有錯誤的內容時,我看到一些開發人員頻道(內部未發佈)構建。

當前dnvm列表輸出:

[email protected]:~$ 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的使用。他們不是,而是從我寫這篇文章的日期開始,只有最近的mono-2015.11.xx nightly builds才能正常工作。在未來的某個時候,一旦發佈穩定的4.3.0+版本,你可能會使用DNX,但我無法確定。

回答

2

在Windows上最新的.NET和Visual Studio工具是1.0.0-beta8, 和我有同樣在我的Ubuntu箱,其中報告說, 單雙x64-1.0.0-beta8-15858是龍頭安裝。

對我來說,你似乎沒有運行在相同的運行時間。

您是否嘗試過運行dnvm upgrade而未定位夜間構建服務器?它在我看來你的代碼可能在beta8-15858運行時使用beta8程序集。

在你的Ubuntu盒子上運行dnu feeds list,以確保你的目標是穩定的渠道,而不是開發者(應該只看到默認的提要)。

如果您的目標是錯誤的Feed,則可以從位於~/.config/NuGet/Nuget.Config下的用戶文件夾中的nuget.config文件對其進行更改。

執行以下操作,確保你在正確的運行時:

  • 刪除所有現有運行時在~/.dnx/runtimes
  • dnvm upgrade
  • dnvm install -r coreclr latest
  • 然後對項目運行的dnu restore
  • dnx web應現在工作
+0

您需要與ASP.NET團隊討論最後一點:P我確定aspnetvnext提要不是正確的。這是一個每晚構建。 –

+0

已更新我的答案以包含Feed:https://www.myget.org/F/aspnetbeta8/api/v2/ https://www.myget.org/F/aspnetbeta8/api/v3/index.json –

+0

已您嘗試運行CoreClr版本而不是單聲道? CoreClr明確支持Ubuntu。 –

1

在ubuntu 14.04上可以運行beta8對付mono。我剛剛給了它一個鏡頭,並取得了成功,這是我遵循的步驟;

  1. 根據說明安裝了dnvm和libuv here

  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;

結果:

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

here執行的針對一個空的Ubuntu 14.04。

+0

我沒有使用單聲道最新快照,而是使用Ubuntu 14.04 LTS附帶的現在很古老的libmono-2.x。在將這個repo添加到我的apt源並安裝它之後,'mono --version'報告了一個更加可敬的'Mono Jit編譯器3.2.8(debian 3.2.8 + ....' - 這當然解釋了低級啓動失敗。:-) –

+0

當我運行'dnvm use 1.0.0-beta8'時,我仍然需要運行'。單聲道單聲道'或我會得到一個啓動錯誤(無法加載文件或程序集system.runtime)。我想dnvm的使用不能把這個要求拿走。由於點語法(.mon-snapshot單聲道),該命令會將東西導入我的bash會話狀態,設置單聲道需要的環境變量,並可能更新路徑,以便找到單聲道運行時環境核心dll? –

+1

指出像我這樣的其他「新手」是有益的,dnvm install不會安裝Mono本身,而是某種Mono鉤子和腳手架,因此上述說明。 –