C#とC++の混合プログラミング

2223 ワード

C#書き込みインタフェースは便利ですが、C++は書き込みアルゴリズムが得意なので、両者を組み合わせるとプログラムの開発速度が速くなり、プログラムの品質が保証されます.しかし、C#とC++のハイブリッドプログラミングには多くの詳細な問題があります.以下、いくつかを簡単に列挙し、対応する解決策を指摘します.
       1. ネイティブC++コード(管理されていないC++)をC#呼び出し用のdllにコンパイルし、[DllImport(×××.dll)] .しかし、ここではDLLからしか関数をエクスポートできず、クラスをエクスポートできません(変数をエクスポートできるかどうかはまだテストされていません).クラスをエクスポートできないのは、ネイティブC++が管理されていないため、C#の言語方式と互換性がありません.つまり、このようなdllを参照としてC#エンジニアリングに追加することはできません.IDEはプログラムセットではないことを示します.
       2. CLR C++(管理C+++)を使用して出力クラスライブラリを作成し、C#のために使用します.CLR C++とC#はCLS仕様に合致するため、両者はシームレスに統合され、1つのソリューションにこの2つの言語のプロジェクトが含まれています.生成されたDLLはクラスをエクスポートできます.しかしCLR C++は従来のC++と大きく異なり、別の言語と考えられ、それを学ぶにも通話料がかかるので、この方法も少し面倒です.CLR C++は、本機C++の多くのコンテンツに互換性がありませんが、ポインタで操作できます.
3.CLR C++を利用して、本機のC++コードを包装して、wrapperを作ります.この方法は比較的良く,設計モードには専門的な名前がある.まずC#プロジェクトの書き込みインタフェースを作成し、CLR C++クラスライブラリプロジェクトとネイティブC++DLLプロジェクトを追加します.本机C++DLLプロジェクトの中でアルゴリズムコードで、クラスをエクスポートすることができます;CLR C++クラスライブラリプロジェクトにクラスを書きます.プライベートメンバーはネイティブC++クラスのポインタです(クラスのインスタンスは使用できません.CLSはブレンドタイプをサポートしていないためです).共通メンバーはネイティブC++DLLクラスの対応する機能です.C#はCLR C++クラスを呼び出し、CLR C++クラスは自機C++クラスを呼び出す.
第1の方法は最も簡単で、CもC++で書かれたdllも呼び出すことができ、あるいはC++でCで書かれたdllを上げることができる.しかし、欠点は、最も外側のパッケージが欠けていることであり、C#側はポインタの初期化、new、deleteなどのメモリ操作を行う必要がある.
例:
C#コードでC++関数を呼び出すには、まずC++関数をDLL形式のライブラリに書き、C#にDLL内の関数をインポートして呼び出すのが一般的です.具体的なコードは次のようになります.
C++コード:
int StaticElementNumber = 10;
extern "C" AFX_API_EXPORT int GetArrayElementNumber()
{
return StaticElementNumber;
}

C#コード:
(関数セクションをインポートし、呼び出し関数があるクラスに書きます)
[DllImport("MFCDll.dll")]
public static extern int GetArrayElementNumber();
int ElementNumber = GetArrayElementNumber();
の詳細は、intやcharなどのデータ型がC++やC#で占有する空間が異なるなど、CLRが自動的に処理されます.(主にマーシャルクラスによる自動処理)
このような呼び出しは、デバッグもサポートします.C#エンジニアリングのPropertiesを開き、DebugタブでEnable unmanaged code debuggingをチェックすると、C++コードデバッグが有効になります.これにより、デバッグモードでこの関数を呼び出すときにF 11を押して関数内部にデバッグを続行できます.
その他の記事:
C#がC++Dllパッケージを呼び出すときに遭遇する一連の問題は、C++インタフェースからC#への変換をどのように実現するかを説明しています.
C#はC++dllファイルを呼び出して、一般的な呼び出し方法を述べて、いくつかの実験をしました
C#はC++DLL関連の問題を呼び出し、C++からC#へのタイプ変換を詳細にリストします.
あなたもマネージドC++を使用しますか?複雑なアプリケーション要件(単純な関数呼び出しではない)に直面した場合、管理C++の使用方法について説明します.