2013-06-27 4 views
0

Уточнение. Существует C++ exe и C# exe. C# exe является оболочкой для C# dll. Мне нужна DLL для вызова функции logger в коде C++ (так что создается только один файл журнала). В настоящее время существует мост C++/CLI, который позволяет C++ exe вызывать методы в C# dll.Методы вызова в приложении C++ из dll C#

Извините, если это плохой вопрос. Возможно, это случай, когда я просто не знаю, что искать/результаты для того, что я ищу, не очень полезно.

У меня есть приложение, написанное на C++. Он называет инструмент, написанный на C#. Похоже, что исполняемый файл для инструмента - это просто оболочка для C# dll. Целью инструментов является анализ и отображение данных. Основное приложение вызывает его, например, для открытия нового файла. Инструменту никогда не приходилось что-либо называть кодом C++, поэтому это всегда было одним из способов. Похоже, что он реализован через мост C++/CLI. Мост вызывает функции в инструменте api.

Теперь требуется, чтобы инструмент вызывал некоторые методы в приложении C++. Я понятия не имею, как это реализовать. Мой опыт работы с C#/C++/CLI находится где-то между бедными и несуществующими. Я начал с попытки клонирования моста C++/CLI и «обратного» его, но поскольку код C# на самом деле, библиотека, вызывающая его с моста, довольно проста. Однако я не уверен (если это возможно), как вызвать приложение C++ с моста.

До сих пор единственное работоспособное решение, которое я могу придумать, это получить вывод кода C# в файл (или, надеюсь, разделяемую память), тогда код C++ проверяет его периодически. Это не близко к идеалу.

Любые советы будут оценены.

Благодаря

+1

Это явно дублирующий вопрос. Вы пробовали это: http://bit.ly/1ah8rhc? –

+1

Я пытаюсь сделать обратное. Мне нужно, чтобы C# dll вызывал метод из C++. Все, что я нашел, похоже, связано с библиотекой C++. Возможно, я тускнею, но я думаю немного меньше, чем вы предполагали. – Hector

+1

Забавно, я вижу, что эти вопросы проходят каждый месяц или около того, но их трудно найти. В любом случае, ответом всегда является saem: используйте P/Invoke (жесткий путь) или пишите слой CLI между ними (путь, насколько я знаю) – stijn

ответ

1

Ok, я думаю, что я буду бросать в предложении здесь.

В зависимости от того, что ваша цель:

1) Цель: выполнить некоторые из вашей логики гр ++ из C# кода.

Решение: этот вопрос довольно прост. Вы извлекаете интересную логику в отдельный проект на C++, создаете ее как библиотеку, а затем используете ее в обоих приложениях. Как вы сказали, есть много примеров того, как вызывать C++ dll из кода C#.

2) Цель: затмить ваше приложение C++ для выполнения некоторой его логики из приложения C#.

Решение: все это связано с настройкой межпроцессного взаимодействия. Существует довольно много подходов, которые перечислены here. Я предлагаю использовать NamedPipes, но вы можете выбрать w/e, с которым вам удобно.

Редактировать: Судя по редактированию, вы, вероятно, хотите получить второе решение.

+0

Я думаю, что вы правы, сейчас самое простое решение - просто иметь DLL со всем кодом регистратора и называть его обоим. Кажется, сейчас так просто! Один из тех, кто хлопает головой о моменты стены ... – Hector

+0

@ user2036256 будьте осторожны с первым подходом tho. Если вы используете одиночную dll для обоих приложений, у вас все равно будут экземпляры _two_ logger (по одному на приложение). Это приведет к исключениям, если эти журналы будут пытаться заблокировать один и тот же текстовый файл одновременно (например, для записи). –

+0

Это * не должно * быть в состоянии. Код регистрирует только действия пользователя, поэтому, если пользователь не может перемещаться между окнами и запускать команду быстрее, чем чтение/запись, это должно быть нормально. Но я добавлю некоторые основные обработки исключений, чтобы быть в безопасности. благодаря – Hector

Смежные вопросы