Как я могу передавать данные (текст) из управляемой сборки в собственную библиотеку и передавать данные (текст) обратно в управляемую сборку?
В частности, я хочу предоставить System.IO.Stream
некоторого видана стороне .NET и ( самое главное ) FILE *
на собственной стороне.
Подпись собственного метода должна быть:
FILE * foo(FILE * bar);
Подпись оболочки вокруг нативного вызова p / invoke должна быть:
CustomStream foo(CustomStream bar);
Я не хочу использовать методы обратного вызова на нативномсторона (одна для получения большего количества данных и одна для установки большего количества данных).Я хочу использовать FILE *
на нативной стороне - и все связанные с ним методы, которые работают с ним , например fprintf
.
Я не хочу дискового ввода-вывода.Это должна быть операция в памяти.
У меня есть полный контроль над управляемой сборкой и собственной библиотекой.
Решение должно работать с .NET 2.0
Я готов создать любой управляемый или неуправляемый слой прокладок, необходимый для этого.
«Очевидное»Решение состоит в том, чтобы использовать STDIN
и STDOUT
и запустить дочерний процесс - однако я не хочу отдельный процесс.Кроме того, мои попытки перенаправить потоки STDIN
и STDOUT
собственной библиотеки, которая не является консольным приложением в Windows, провалились несколько впечатляюще (и с большим количеством ударов головой).
На основании этоговопрос: Перенаправление stdout + stderr в службе Windows на C # Я попытался изменить подход, чтобы (по крайней мере) решить «ответный» поток половины моей проблемы - но без FileStream
(так как я хочу что-тоболее аналогично MemoryStream
).Тем не менее, FileStream
является единственным типом потока, который предоставляет подходящий низкоуровневый дескриптор потока.
В остальном, я довольно хорошо застрял и в настоящее время думаю, что мне нужно будет погрузиться глубже и придумать свойсобственная управляемая вручную <-> управляемая потоковая реализация, но я не знаю, с чего начать.
Решение
Наконец-то!
Я разместил полный пример проекта здесь:
http://pastebin.com/jcjHdnwz
Это для .NET 3.5 и использует AnonymousPipeServerStream
- но с небольшим количествомОтражая, достаточно просто дублировать внутреннюю работу AnonymousPipeServerStream
в .NET 2.0.
Спасибо за вашу помощь shf301 за указание мне на собственный API канала, который получиля изучил документы Microsoft для лучшего понимания происходящего и указал, что мне нужно было использовать метод _open_osfhandle
, чтобы получить справку FILE *
.