C ++ / CLI DLL中的本机代码

时间:2012-06-30 06:54:30

标签: .net visual-studio-2010 c++-cli

我希望尽可能接近实时,所以我的意图是让代码中最关键的部分不受管理(我不希望GC阻止执行)。所以我尝试了这个:

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 个答案:

答案 0 :(得分: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());
    }
};

答案 1 :(得分:0)

C ++ - CLI是托管扩展,允许您直接使用.NET函数,例如您在示例中显示的Console.WriteLine。它被编译成托管程序集。如果您需要非托管代码,则必须指示编译器生成非托管代码。但在这种情况下,显然你将不得不忘记.NET函数。

答案 2 :(得分:0)

嗯,我可能误解了你的要求,但我对此感到窒息:

  

我不希望GC阻止执行

这取决于您正在使用的互操作方案,但一般情况下,您无法通过简单地使应用程序的某些部分不受管理来阻止执行线程的暂停。任何在其调用堆栈中具有CLR根的线程都可能被GC劫持并暂停,无论该线程是否恰好执行“非托管”代码。