これを技術的に機能させることができることはわかっていますが、可能な限りクリーンなソリューションを実装したいと考えています。状況は次のとおりです。
アンマネージ C スタイル ライブラリをラップするマネージ ライブラリがあります。私が現在ラップしている C スタイルのライブラリ機能は、文字列のリストを含むいくつかの処理を行います。ライブラリのクライアント コードはデリゲートを提供できます。リストの処理中に「無効な」シナリオが発生した場合、ライブラリはこのデリゲートを介してクライアントにコールバックし、クライアントが使用する戦略を選択できるようにします (例外をスローし、無効な文字など)
私が理想的に望んでいるのは、すべてのマネージ C++ を 1 つの関数に分離してから、アンマネージ パラメーターのみを受け取る別の関数を呼び出して、すべてのネイティブ C++ とアンマネージ コードをその時点で分離できるようにすることです。このアンマネージ コードにコールバック メカニズムを提供することは、私にとって難点であることがわかっています。
#pragma managed
public delegate string InvalidStringFilter(int lineNumber, string text);
...
public IList<Result> DoListProcessing(IList<string> listToProcess, InvalidStringFilter filter)
{
// Managed code goes here, translate parameters etc.
}
#pragma unmanaged
// This should be the only function that actually touches the C-library directly
std::vector<NativeResult> ProcessList(std::vector<char*> list, ?? callback);
このスニペットでは、すべての C ライブラリ アクセスを ProcessList 内に保持したいのですが、処理中にコールバックを実行する必要があります。このコールバックは、一部のクライアントから渡される InvalidStringFilter デリゲートの形式で提供されます。私の管理ライブラリ。