1. ホーム
  2. .net

[解決済み] マネージド」と「アンマネージド」の違いについて

2022-05-12 05:17:44

質問

.NETについて話しているときに時々耳にしたり読んだりするのですが、例えば"マネージドコード"と"アンマネージドコード"が何であるか、そしてそれらの違いは何であるかが全く分かりません。定義上、何が違うのでしょうか?どちらかを使用すると、どのような結果になるのでしょうか?この区別は.NET/Windowsにのみ存在するのでしょうか?

どのように解決するのですか?

管理されたコード

マネージドコードは、Visual Basic .NET と C# コンパイラが作成するものです。これは CLR (Common Language Runtime) 上で実行され、特にガベージ コレクション、ランタイム型チェック、参照チェックなどのサービスを提供します。つまり、"私のコードは次のようなものだと考えてください。 管理されている CLRによって管理されている、と考えてください。

Visual BasicとC#は だけ したがって、これらの言語のいずれかでアプリケーションを記述している場合、CLR によって管理されるアプリケーションを記述していることになります。Visual C++ .NET でアプリケーションを記述している場合、必要に応じてマネージド コードを生成することができますが、それは任意です。

アンマネージ コード

アンマネージドコードは、機械語にそのままコンパイルされます。つまり、その定義によれば、従来の C/C++ コンパイラでコンパイルされたすべてのコードは「アンマネージドコード」です。また、中間言語ではなくマシン コードにコンパイルされるため、非移植型です。

CLR が提供する自由なメモリ管理やその他のものはありません。

Visual Basic や C# ではアンマネージコードを作成できないため、Visual Studio ではアンマネージコードはすべて C/C++ で記述されます。

2つの混合

Visual C++ はマネージ コードまたはアンマネージ コードのいずれかにコンパイルできるので、同じアプリケーションで 2 つを混在させることが可能です。これは 2 つの間の境界をあいまいにし、定義を複雑にしますが、たとえば、ひどく書かれたアンマネージ コードでサード パーティのライブラリを使用している場合、まだメモリ リークが発生する可能性があることを知っておくだけでも言及する価値があります。

以下は、私が以下の方法で見つけた例です。 ググる :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}