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

うーん、私はおそらくあなたの要件を誤解しましたが、私はこれで窒息しています:

GC で実行をブロックしたくない

使用している相互運用シナリオによって異なりますが、一般に、アプリケーションの一部を管理対象外にするだけでは、実行スレッドの中断を防ぐことはできません。コール スタックに沿って CLR ルートを持つスレッドは、GC によってハイジャックされ、停止される可能性があります。このスレッドがたまたま「アンマネージ」コードを実行したとしてもです。

于 2012-07-07T10:26:27.020 に答える
0

C++-CLI は、例で示したような .NET 関数を直接使用できるようにするマネージ拡張ですConsole.WriteLine。これはマネージ アセンブリにコンパイルされます。アンマネージ コードが必要な場合は、アンマネージ コードを生成するようにコンパイラに指示する必要があります。しかし、この場合、明らかに .NET 関数を忘れる必要があります。

于 2012-06-30T07:00:16.683 に答える