0

我希望尽可能接近实时,所以我的意图是让代码中最关键的部分不受管理(我不希望 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 是唯一的方法吗?

4

3 回答 3

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());
    }
};
于 2012-06-30T07:21:55.033 回答
0

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

于 2012-06-30T07:00:16.683 回答
0

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

我不希望 GC 阻止执行

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

于 2012-07-07T10:26:27.020 回答