在Mac OS X上用自己編譯出的CoreCLR運行.NET程序


當昨天被Mac OS X上無法編譯CoreCLR的問題困擾時(詳見Mac OS X上嘗試編譯CoreCLR源代碼),后來發現這個難題竟然被神人@kangaroo給解決了,連CoreCLR的微軟開發人員也大吃一驚(詳見#105)。

@kangaroo This is awesome! Thank you so much for doing it! I’ll start reviewing it in the morning.

今天發現,@kangaroo修改后可在OS X上編譯的版本已被合並到CoreCLR的主分支上(詳見Merge pull request #117 from kangaroo/osx),直接git簽出就能編譯了。如果編譯時出現"not found for architecture x86_64"的錯誤,需要刪除binaries文件夾之后重新編譯。

編譯成功之后,你會在 binaries/Product/amd64/debug 文件夾中看到下面三個文件:

corerun		libcoreclr.dylib	libmscordaccore.dylib

緊隨編譯成功的喜悅,一個沖動油然而生——用這個自己編譯出來的CoreCLR運行.NET程序。

要運行.NET程序時,發現 binaries/Product/amd64/debug 中少了一個重要的文件——mscorlib.dll,不知道編譯時為什么沒生成。

@kangaroo也知道了這個問題,將這個文件發給了我(如果你需要,可以在這里下載),於是將這個文件復制到 binaries/Product/amd64/debug 中。

接下來是准備要運行的.NET程序,突然想到之前在閱讀園子里的博文用CIL寫程序:你好,沃爾德時,照着手工敲出過一段.NET控制台應用程序的IL代碼(代碼如下),何不就用這個呢?

.assembly extern mscorlib
{
    .ver 4:0:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
.assembly 'HelloWorld'
{
    .custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::'.ctor'() = (
        01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78
        63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01       )

    .hash algorithm 0x00008004
    .ver  0:0:0:0
}
.module HelloWorld.exe
.method static void Main()
{
    .entrypoint
    .maxstack 1

    ldstr "Hello, world!"
    call void [mscorlib]System.Console::WriteLine(string)
    
    ret
}

然后用Mono的ilasm將il代碼生成為程序集HelloWorld.exe:

ilasm HelloWorld.il

接着將HelloWorld.exe復制到 binaries/Product/amd64/debug 中,現在這個文件夾中就有了5個文件:

/git/dotnet/coreclr/binaries/Product/amd64/debug
HelloWorld.exe		corerun			libcoreclr.dylib	libmscordaccore.dylib	mscorlib.dll

激動人心的緊張時刻到來了,我們來用自己編譯出來的CoreCLR運行HelloWorld.exe試試:

$ ./corerun HelloWorld.exe
Hello, world!

耶!成功!

雖然這只是一小步,雖然實現在Mac上開發.NET應用任重而道遠,但是.NET開源帶來的精彩已經到來!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM