Re: C#的視窗程式設計
※ 引述《freaky (jon)》之銘言:
:     C++ 當然可以直接創造 COM 物件, 也可以直接呼叫 APIs.
:     如果還要透過 BCL, MC++ 就不叫 "唯一" 可以混用 managed 和
:     unmanaged code 的 .NET 語言. 只有當 unmanaged code 要儲存 managed 物件
:     的時候, 才需要藉由 System.Runtime.InteropServices 裡的 GCHandle 完成.
      將剛剛你的那個程式, 用 ildasm 來看:
.method public static int32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)
        main() cil managed
{
  .vtentry 1 : 1
  // Code size       35 (0x23)
  .maxstack  1
  .locals (valuetype NoGCclass* V_0,
           class GCclass V_1)
  IL_0000:  ldnull
  IL_0001:  stloc.1
  IL_0002:  ldc.i4.1
  IL_0003:  call       void* modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) new(unsigned int32)
  IL_0008:  stloc.0
  IL_0009:  ldloc.0
  IL_000a:  call       void modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) NoGCclass.Hello(valuetype NoGCclass* modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier))
  IL_000f:  ldloc.0
  IL_0010:  call       void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) delete(void*)
  IL_0015:  newobj     instance void GCclass::.ctor()
  IL_001a:  stloc.1
  IL_001b:  ldloc.1
  IL_001c:  call       instance void GCclass::Hello()
  IL_0021:  ldc.i4.0
  IL_0022:  ret
} // end of method 'Global Functions'::main
  由此可知:
    1. main 是 managed
    2. 其中的 unmanaged 是透過 CompilerServices.
: :       我不否認目前 C# compiler 並沒有產生 native code 的能力,
: :       不然早就可以直接執行了, 也不需要裝什麼的...
:     C# 設計上本來就是要在 CLR 環境下執行的.
      要是單只是不要 gc 的話, C# 只要加個 unsafe 就行了...
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw) 
◆ From: 218.184.81.80
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章