Как я могу передавать данные из управляемой сборки в собственную библиотеку и обратно? - PullRequest
10 голосов
/ 19 декабря 2011

Как я могу передавать данные (текст) из управляемой сборки в собственную библиотеку и передавать данные (текст) обратно в управляемую сборку?

В частности, я хочу предоставить 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 *.

1 Ответ

11 голосов
/ 19 декабря 2011

Вы должны быть в состоянии сделать это, используя AnonymousPipeStream в .NET 3.5 или выше.Это предоставляет дескриптор через свойство SafePipeHandle, которое вы можете передать SetStdHandle.

. Для .NET 2.0 вам может потребоваться P / Invoke для API неуправляемого канала.

...