久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ASP.NET 5是如何通過(guò)XRE實(shí)現(xiàn)跨平臺(tái)的

 yan的圖書41 2015-02-04

.NET程序員也有自己的幸福,.NET的跨平臺(tái)是一種幸福,,.NET的開源也是一種幸福,,而更幸福的是可以通過(guò)開源的.NET了解.NET是如何一步步走向跨平臺(tái)的,所以幸福是一種過(guò)程,。

AD: WOT2015 ?????????????????? ???????

好奇號(hào)火星車

.NET程序員也有自己的幸福,,.NET的跨平臺(tái)是一種幸福,,.NET的開源也是一種幸福,而更幸福的是可以通過(guò)開源的.NET了解.NET是如何一步步走向跨平臺(tái)的,,所以幸福是一種過(guò)程,。

在.NET跨平臺(tái)的進(jìn)程中,ASP.NET顯然走在了前頭,,而通過(guò)探究ASP.NET 5是如何實(shí)現(xiàn)跨平臺(tái)的,,可以稍稍滿足一下自己的好奇心。

體驗(yàn)ASP.NET 5跨平臺(tái)有2種方式:

1)在Mac下,,git簽出XRE的源代碼(前身是KRuntime),,然后運(yùn)行sh build.sh,就能完成整個(gè)XRE項(xiàng)目的生成,。

2)在Mac下,,寫一個(gè)簡(jiǎn)單的ASP.NET項(xiàng)目,然后用k kestrel運(yùn)行,,詳見不寫1行代碼,,在Mac上體驗(yàn)ASP.NET 5的最簡(jiǎn)單方法

這篇博文就從k命令下手,,一探ASP.NET 5跨平臺(tái)的究竟,。

運(yùn)行k kestrel(即將是dotnet kestrel),實(shí)際運(yùn)行的是下面的命令(根據(jù)project.json中的commands配置):

k "Microsoft.AspNet.Hosting --server kestrel --server.urls http://localhost:8002"

Microsoft.AspNet.Hosting是一個(gè).NET控制臺(tái)程序?qū)崿F(xiàn)的OWIN Host(源碼),,kestrel是一個(gè)基于libuv用.NET實(shí)現(xiàn)的OWIN Server(也是Web Server,,源碼),kestel是由Microsoft.AspNet.Hosting加載的,。

既然Microsoft.AspNet.Hosting是一個(gè)托管程序,,它自己是無(wú)法直接運(yùn)行的。因?yàn)檫\(yùn)行一個(gè).NET程序的前提條件是CLR已運(yùn)行,,而CLR自己不能運(yùn)行自己,,CLR運(yùn)行的前提是有一個(gè)host程序?qū)⑺虞d。

如果你在Mac下用過(guò)Mono,,就你就知道運(yùn)行一個(gè).NET程序需要用mono命令,,mono命令的作用就是創(chuàng)建一個(gè)進(jìn)程,加載Mono Runtime(Mono CLR),,然后由Mono Runtime執(zhí)行.NET程序,。

而在ASP.NET 5中,并沒有直接用mono命令,,而是k命令,,自從KRuntime改名為XRE之后,k命令也將會(huì)被dotnet命令取代,。

dotnet.sh

在非Windows平臺(tái)下,,k命令對(duì)應(yīng)的是k.sh?,F(xiàn)在改為XRE之后,也就是donet命令對(duì)應(yīng)dotnet.sh,。所以ASP.NET 5跨平臺(tái)的秘密就藏在dotnet.sh中,。

下面就直擊XRE項(xiàng)目中的scripts/dotnet.sh:

 
#...
if [ -f "$DIR/mono" ]; then
  exec "$DIR/mono" $MONO_OPTIONS "$DIR/dotnet.mono.managed.dll" "$@"
else
  exec mono $MONO_OPTIONS "$DIR/dotnet.mono.managed.dll" "$@"
fi
 

毫無(wú)懸念,依然用的是mono,。但是用了mono,,如何加載.NET Core CLR,難道還是用Mono Runtime,?

帶著這個(gè)疑問,,順藤摸瓜,,看dotnet.mono.managed.dll干了啥,。

dotnet.mono.managed.dll的實(shí)現(xiàn)代碼就在XRE項(xiàng)目中,是一個(gè)簡(jiǎn)單的C#控制臺(tái)程序,,它干了兩件事:1)分析命令行參數(shù),;2)調(diào)用RuntimeBootstrapper.Execute():

 
public class EntryPoint
{
    public static int Main(string[] arguments)
    {
        //...
        arguments = ExpandCommandLineArguments(arguments);
        //...
        return RuntimeBootstrapper.Execute(arguments);
    }
}
 

繼續(xù)順藤摸瓜至 [dotnet.hosting.RuntimeBootstrapper],[RuntimeBootstrapper.Execute()] 調(diào)用了 [RuntimeBootstrapper.ExecuteAsync()],。

而托管的 [RuntimeBootstrapper.ExecuteAsync()] 竟然拐了個(gè)彎,,執(zhí)行了非托管的dotnet命令(一個(gè)由dotnet.cpp實(shí)現(xiàn)的C++程序)。

mono命令(非托管) -> Mono Runtime -> dotnet.mono.managed(托管) -> RuntimeBootstrapper(托管) -> dotnet命令(非托管),,ASP.NET 5 XRE的代碼真是十八彎,。

千呼萬(wàn)喚始出來(lái),原來(lái)真正的主角就藏在十八彎之后,。

dotnet.cpp加載了非托管的dotnet.coreclr.dll:

LPCWSTR pwzHostModuleName = L"dotnet.coreclr.dll";
m_hHostModule = ::LoadLibraryExW(pwzHostModuleName, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
pfnCallApplicationMain = (FnCallApplicationMain)::GetProcAddress(m_hHostModule, pszCallApplicationMainName);

而dotnet.coreclr.dll是由XRE中的C++程序dotnet.coreclr.cpp實(shí)現(xiàn)的,,最終由dotnet.coreclr.cpp加載了coreclr.dll: 

hCoreCLRModule = ::LoadLibraryExW(L"coreclr.dll", NULL, 0);

dotnet.coreclr.cpp就是加載CLR的主角。

這不讓人產(chǎn)生疑問,,這也可以,??jī)H靠一個(gè)C++程序就能加載CLR,執(zhí)行.NET程序,,那我們?cè)赪indows上為什么要安裝一個(gè)龐大的.NET Framework,?

真的可以!一個(gè)非托管的host程序+CLR,,就能運(yùn)行.NET程序,,不信你可以看這篇文章震撼一下:Hosting .NET Core Clr in your own process 。

加載CLR的目的是為了執(zhí)行.NET程序集中的IL代碼,,而要執(zhí)行的程序集是由dotnet命令(前身是k命令)的命令行參數(shù)所傳遞過(guò)來(lái)的,,比如dotnet kestrel(之前是k kestrel),對(duì)應(yīng)的程序集是 Microsoft.AspNet.Hosting,。CLR調(diào)用 Microsoft.AspNet.Hosting.Program.Main() 方法開始執(zhí)行,,ASP.NET 5就開始干活了,。

Core CLR被加載、Microsoft.AspNet.Hosting被運(yùn)行之后,,在 RuntimeBootstrapper.ExecuteAsync() 中,,還繼續(xù)加載了一些dotnet.host的相關(guān)程序集(注意:這時(shí)不是Core CLR,而是Mono Runtime),。

 
//...
var assembly = Assembly.Load(new AssemblyName("dotnet.host"));
//...
var loaderContainerType = assembly.GetType("dotnet.host.LoaderContainer");
var cachedAssemblyLoaderType = assembly.GetType("dotnet.host.CachedAssemblyLoader");
var pathBasedLoaderType = assembly.GetType("dotnet.host.PathBasedAssemblyLoader");
//...
 

到這里,,不知你有沒有被這十八彎給繞暈,如果沒被繞暈,,請(qǐng)繼續(xù)往下看,。

疑問

這時(shí)一個(gè)大大的問號(hào)浮現(xiàn)在眼前,既然dotnet命令能直接加載Core CLR,,為什么還要用mono命令中轉(zhuǎn)一下,?

百思不得其解。,。,。

在寫這篇博文的過(guò)程中,突然產(chǎn)生了一個(gè)大膽猜想——

在Core CLR被加載,,Microsoft.AspNet.Hosting被執(zhí)行之后,,為什么還要用Mono Runtime加載一些dotnet.host相關(guān)的程序集?為什么不直接用Core CLR加載呢,?這只能用一個(gè)原因來(lái)解釋,,dotnet.host依賴的一些程序集在在.NET Framework中有實(shí)現(xiàn),但是在.NET Core Framework中還沒有實(shí)現(xiàn),,而Mono是.NET Framework的一個(gè)跨平臺(tái)實(shí)現(xiàn),,在Mono中也有對(duì)應(yīng)的實(shí)現(xiàn)。完整的.NET Core Framework(github.com/dotnet/corefx)還在緊張開發(fā)之中,,在它出來(lái)之前,,微軟只能借助Mono。這也是ASP.NET的跨平臺(tái)走在前面要付出的代價(jià),,隨著.NET Core Framework的完成,,XRE的改進(jìn),可以預(yù)計(jì)ASP.NET的跨平臺(tái)是會(huì)脫離Mono的,。

當(dāng)然,,這只是一個(gè)猜想,如果你知道真相,,歡迎來(lái)揭開,。

【編輯推薦】

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多