Создание DLL C# и использование его от неуправляемого C++

У меня есть собственное (неуправляемое) приложение C++ (использующий wxWidgets если это имеет значение). Я рассматриваю отдельное заявление инструмента, которое будет записано в C#, который содержал бы находящиеся в winform диалоговые окна. помещение некоторых из тех диалоговых окон в отдельном DLL было бы полезно, поскольку я буду надеяться смочь использовать их из своего приложения C++.

Но я понятия не имею, сколько бездельничания необходимо для выполнения этого, действительно ли это особенно легко?

Править:

Я не должен вызывать диалоговые функции непосредственно. Мне просто нужен путь к моему приложению C++ для вызова API в DLL C# для передачи данных и пути к DLL C# для вызова методов на некотором объекте наблюдателя/спины в приложении C++.

например, от C++:

CSharpManager *pCSM = SomehowGetPointerToCSharpObject();
CSharpObserver pCSO = new CSharpObserver;

pCSM->RegisterCPlusPlusObserver(pCSO);
pCSM->LaunchDialog();

Поскольку пользователь действительно наполняет в диалоговом окне C#, методы полицейского общественной поддержки называют для пасования назад данных в C++

Таким образом, это - в значительной степени необработанный C++/C# вопрос о коммуникации, я думаю. Но хотя я знаю C++ и C#, я не знаю, как сам .NET работает. Я знаю COM, но действительно избежал бы его, я сомневаюсь относительно любых других разработчиков, с которыми я работаю, знают это.

14
задан Mr. Boy 21 March 2010 в 17:45
поделиться

6 ответов

Это зависит от того, что вы имеете в виду под словами «Я надеюсь, что смогу использовать их в моем приложении C ++».

В естественном мире диалог имеет структуру шаблона диалогового окна, и вы можете «приготовить» это в ваш исполняемый файл, будь то DLL или EXE. Отлично. Но в управляемом мире дела обстоят немного иначе. Для приложений Winforms не существует типа ресурса «шаблон диалога». Вместо этого формы - это просто код.

Однако:

  • Вы всегда можете ВЫЗОВИТЬ управляемую DLL из неуправляемого кода. Это банально. Эта управляемая DLL может отображать ваши диалоги Winforms. Так что родная часть вашего приложения C ++ может вызывать эти диалоги. Но он не может создать их напрямую без дополнительной работы.

  • Вы всегда можете вставить «прокладочную DLL» C ++ / CLI между вашим собственным кодом C ++ и вашей управляемой DLL. В C ++ / CLI вы можете прозрачно загружать как управляемые, так и .NET ресурсы / диалоги.

  • В этом отношении вы можете вызывать методы .NET напрямую из машинного кода, без промежуточной DLL-прокладки C ++ / CLI, хотя это немного беспорядочно.

Но что касается использования "диалогового ресурса .NET / Winforms напрямую" ... нет. Не в смысле , использующего один и тот же шаблон диалогового окна как для Winform, так и для собственного C ++.

1
ответ дан 1 December 2019 в 15:01
поделиться

lingua franca взаимодействия в неуправляемом коде - это COM. На стороне C # это сделать очень легко, просто используйте атрибут [ComVisible ] . Вам нужно будет написать COM-код в вашей программе на C ++, чтобы использовать его, что будет не так просто, если вы никогда этого не делали. Начните с директивы #import , если вы используете компилятор MSVC.

Ваш следующий вариант - разместить среду CLR в своем неуправляемом коде самостоятельно, а не полагаться на уровень взаимодействия COM, который позаботится об этом. Он позволяет напрямую создавать управляемые типы. Для этого также требуется COM, но только для загрузки и инициализации CLR. Этот проект показывает подход.

7
ответ дан 1 December 2019 в 15:01
поделиться
1
ответ дан 1 December 2019 в 15:01
поделиться

Либо используйте COM, либо напишите оболочку C ++ / CLI, которая вызывает ваш диалог C #, а затем вызовите эту оболочку C ++ / CLI из вашего неуправляемого кода C ++.

2
ответ дан 1 December 2019 в 15:01
поделиться

Я знаю, что здесь есть несколько ответов, но ни один из них не указывает на рабочий пример. Когда я столкнулся с этой проблемой, я смог разобраться благодаря этому примеру.

http://support.microsoft.com/kb/828736

1
ответ дан 1 December 2019 в 15:01
поделиться

Я собирался опубликовать это как комментарий к более раннему сообщению, но, поскольку вы еще не приняли никаких ответов, возможно, это будет тот, который вы ищем.

В вашем исходном сообщении был один вопрос: «Это особенно просто?» Ответ на этот вопрос - категорический нет , о чем свидетельствуют ответы, которые вы получаете.

Если другие предложения (собственный экспорт / COM / и т. Д.) «Не подходят вам» (ваши слова!), И вы не сможете погрузиться в них и учиться, я бы посоветовал вам пересмотреть предложенную вами архитектуру.

Почему бы не написать общие функции в библиотеке C ++, которую затем будет проще использовать в вашем существующем приложении C ++? Как правило, потреблять собственные компоненты из управляемого кода намного проще, чем наоборот, поэтому написать приложение C # для использования общей библиотеки DLL C ++ будет намного проще.

Я понимаю, что это не отвечает на исходный технический вопрос, но, возможно, это более прагматичный ответ на проблему, с которой вы столкнулись.

-1
ответ дан 1 December 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: