我下面的各種博客文章展示瞭如何把一個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」版本有關,該版本在今天的公共服務器上短暫可見,然後消失。
一些一般性的設置步驟:
- 檢查〜/的.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來安裝。)
克隆你的源代碼。
選擇通過dnvm使用DNX版本。
確保通過DNU恢復您的用戶帳戶級別DNX運行時包被恢復。
??什麼?
前往文件夾包含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,但我無法確定。
您需要與ASP.NET團隊討論最後一點:P我確定aspnetvnext提要不是正確的。這是一個每晚構建。 –
已更新我的答案以包含Feed:https://www.myget.org/F/aspnetbeta8/api/v2/ https://www.myget.org/F/aspnetbeta8/api/v3/index.json –
已您嘗試運行CoreClr版本而不是單聲道? CoreClr明確支持Ubuntu。 –