Я знаю, что могу заставить это работать технически, но я хотел бы реализовать самое чистое возможное решение. Вот ситуация:
У меня есть управляемая библиотека, которая упаковывает неуправляемую библиотеку в стиле Си. Функциональность библиотеки в стиле C, которую я сейчас обертываю, выполняет некоторую обработку со списком строк. Клиентский код библиотеки может предоставить делегата, так что во время обработки списка, если встречается «недопустимый» сценарий, библиотека может перезвонить клиенту через этого делегата и позволить им выбрать стратегию для использования (выбросить исключение, заменить недопустимые символы и т. д.)
В идеале я хотел бы, чтобы все управляемые C ++ изолировались в одной функции, а затем могли вызывать отдельную функцию, которая принимает только неуправляемые параметры, так что весь нативный 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, который передается из какой-то клиент моей управляемой библиотеки.