2012-06-30 47 views
0

我想盡可能接近實時,所以我的意圖是讓代碼中最關鍵的部分不受管理(我不希望GC阻止執行)。所以我試過這個:本機代碼在C++/CLI DLL

class Native 
{ 
public: 
    int GetValue() 
    {  
     return 1; 
    } 
}; 

ref class Managed 
{ 
public: 
    void Test() 
    { 
     Native n; 
     Console::WriteLine(n.GetValue()); 
    } 
}; 

ILDASM顯示編譯爲IL的Native :: GetValue。是否可以保持這個類/功能不受管理?是一個專門的非託管dll唯一的方法來做到這一點?

回答

3

它看起來像我需要#pragma指令:

#pragma unmanaged 

class Native 
{ 
public: 
    int GetValue() 
    {  
     return 1; 
    } 
}; 

#pragma managed 

ref class Managed 
{ 
public: 
    void Test() 
    { 
     Native n; 
     Console::WriteLine(n.GetValue()); 
    } 
}; 
0

C++-CLI是託管擴展,允許您直接使用.NET功能,例如您在示例中顯示的Console.WriteLine。它被編譯成一個託管程序集。如果你想要非託管代碼,你必須指示編譯器生成非託管代碼。但在這種情況下,顯然你將不得不忘記.NET函數。

+1

實際上,有一種方法可以在同一個DLL中合併託管代碼和非託管代碼。 –

+0

是的,但生成的程序集將被管理,並由CLR處理,這正是我以前想要避免的。這正是C++ - CLI的用處:將一些現有的本地代碼輕鬆移植到託管平臺。 –

+0

正如之前所說,由於性能方面的考慮,我只需要保留一些類/函數不受管理。 –

0

嗯,我可能誤解了你的要求,但我窒息了這一點:

我不想GC阻斷執行

它取決於您正在使用的互操作場景,但一般情況下,您將無法通過簡單地生成部分ap來防止暫停執行線程折衷管理。無論該線程是否執行「非託管」代碼,任何在其調用堆棧中具有CLR根的線程都可能被GC劫持和暫停。