|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Перечитал кучу форумов, пробовал — ничего не помогает. Ситуация следующая. Есть программа, назовем ее Читалка. Она открывает текстовые файлы. При смене страницы Читалка вызывает определенную функцию dll (это настраивается) и передает номер страницы. В С++ данный метод выглядит так: Код: plaintext 1.
Всё работает, эта функция выполняется. Мне нужно, чтобы этот метод С++ вызывал, в свою очередь , метод C#. Обращаю внимание, что С++ приложение — managed (/clr) написано в VS 2010. И в моем солюшене есть два проекта: С++ с вышеперечисленным методом и C#. я пытаюсь вызвать методы C# из функции С++ следующими способами: статический: Код: plaintext 1.
обычный: Код: plaintext 1. 2.
— всё компилируется, НО в run-time даже этот С++ метод не вызывается, как будто его нет! Само собой, до C# дело вообще не доходит! Если я комментирую эти вызовы C#, то всё опять работает! Если я напишу Код: plaintext 1. 2.
— то это работает! Хотя System::DateTime — это .NET метод! В чем может быть дело? я даже добавил в С++: Код: plaintext 1. 2.
— не помогло! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2014, 18:39 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, возможно ваша сборка С# не соответствует обще языковой спецификации, разные языки хотя и тянут кони из одного места проверьте наличие атрибута в сборке http://msdn.microsoft.com/ru-ru/library/system.clscompliantattribute(v=vs.110).aspx это то что пришло в голову первое, хотя я думал компилятор будет подсказывать такие нюансы, а он что молчит? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2014, 18:58 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Где-то в степи, Добавил Код: c# 1. 2.
Также пометил классы: Код: c# 1. 2. 3. 4. 5.
— не помогло. Компилятор молчит, компилирует успешно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2014, 10:15 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, Может загрузить сборку C# отдельным доменом на хост и исследовать, ведь что то должно загрузиться, к сожалению я в цейтноте, вечером могу попробовать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2014, 10:55 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Что значит «отдельным доменом на хост»?? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2014, 11:03 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, У вас ведь простое виндовс приложение работающее с clr, так вот clr организовано как com который является хост средой для размещения всех net сборок, к стати там есть различия по загрузке от номера фремвока, по умолчанию создается основной домен ( выгружается при умирании всего приложения), можно создать в контексте еще домен, и в ручную подгрузит сборку, так как домены изолированы ( общение через маршалинг) то при ненадобности можно отгрузить новый домен, а в заместо него создать еще один и подгрузить нужные библиотеки ( как то так по быстрому) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2014, 11:21 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, создал решение С# dll Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
создал консоль C++ прицепил к ней длл C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
в общем все заработало по дефолту.. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2014, 20:28 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Спасибо, попробовал так же сделать — действительно работает! Но цепочка Код: plaintext
Буду разбираться дальше... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 13:57 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, авторЧиталка-> С++ dll -> C# dll в данном случае PInvoke , и не забывать выбрать соответствующую модель освобождения стека в С++ авторЧиталка -> С++ (CLR) dll -> C# dll а это мс крайне не рекомендует!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 14:06 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Я рассмотрел выше вариант доступ к неуправляемому или управляемому но написанному под C++(crl) из длл C# ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 14:10 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Получается, у меня как раз второй, не рекомендуемый вариант: Код: plaintext
Правда, я не понял, почему он не рекомендуется. То есть, получается, надо заморачиваться с PInvoke... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:18 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, Я не знаю, на многих постах в стаковерфлейм встречал рассуждение что не рекомендуется из C# таскать исполнение из кода написанного на с++(clr). может да ну его ++, а написать библиотеку на шарпе ( это тоже самое, только проще) ну если вы не очень с ним дружите, то естественно что лучше для вас писать на чистом с++ а вызывать исполняемый код через PInvoke, эта та технология обыденная и публичная. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:46 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Где-то в степиЯ не знаю, на многих постах в стаковерфлейм встречал рассуждение что не рекомендуется из C# таскать исполнение из кода написанного на с++(clr). писатели скорее просто не справились ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:54 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, У меня вообще недоумение от вашего поста. Сначала Вы испытывали проблемы: использование функционала библиотеки написанной на C# в коде С++ Когда вы этот вопрос решили, у вас возникла проблема - наоборот ( по использованию кода) У вас что это тренинг такой? как бы такие желания в реальный проект мало укладываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:54 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, ещё раз - имеется обычное с++ приложение, обращается к managed c++ dll, которая в свою очередь обращается к c# dll? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:56 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Изопропил, не знаю, попробую позднее, ради интереса ... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 17:59 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
ИзопропилКапюшон, ещё раз - имеется обычное с++ приложение, обращается к managed c++ dll, которая в свою очередь обращается к c# dll? так он же я так понял решил ее. авторСпасибо, попробовал так же сделать — действительно работает! прицепляй к прокси библиотеку Video, и работай без всяких ограничений.. ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 18:04 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Где-то в степи, на мой взгляд - самый простой способ с++ native -> c# использовать IDispatch ( с небольшим костылём, позволяющим обойтись без регистрации COM) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 18:17 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Подождите, ребята, Эта задача не тестовая и не учебная, а совершенно реальная, рабочая. И я ее пока не решил. У меня получилось лишь успешно проверить пример с С++ Console + C# dll. Смотрите, ситуация такая. Есть приложение — Читалка. Можно ее так настроить, чтобы при наступлении определенных событий она вызывала функции предоставленной dll. Это работает, есть пример с С++ dll. Я С++ знаю плохо, и хочу перевести вызов в C# как можно быстрее. Пока этого у меня не получилось. Где-то в степи предложил сразу написать библиотеку на C# — но разве такое возможно?? Есть программа DLL Export Viewer — она позволяет «увидеть» содержимое dll — мне не удалось написать библиотеку на C#, которую «было бы видно извне». А вот библиотеку С++ видно без проблем. Если бы удалось написать такую штуку сразу на C# — это было бы просто чудесно! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 20:01 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон Где-то в степи предложил сразу написать библиотеку на C# — но разве такое возможно?? Есть программа DLL Export Viewer — она позволяет «увидеть» содержимое dll — мне не удалось написать библиотеку на C#, которую «было бы видно извне». А вот библиотеку С++ видно без проблем. Если бы удалось написать такую штуку сразу на C# — это было бы просто чудесно! это реально, правда запашок не очень (разобрать ILDASM, поправить IL код, собрать обратно ILASM) пример - здесь - http://www.codeproject.com/Articles/16374/How-to-Write-a-Terminal-Services-Add-in-in-Pure-C ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 20:14 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Капюшон, что то я запутался. авторСмотрите, ситуация такая. Есть приложение — Читалка. Можно ее так настроить, чтобы при наступлении определенных событий она вызывала функции предоставленной dll. Это работает, есть пример с С++ dll. теперь вы берете пример ++ управляемом и пытаетесь вызвать функционал из линкованной С# у вас не получается? вообще то если получилось с консолью и простой длл диеза получится и выше, прилинкуйте к длл диеза( тестовой) вашу рабочую диезную длл video( так вроде она называлась выше) и работай те через прокси ( тестовая длл диеза), я может мудрено объясняю если консоль ++ и тест длл(#) успешна должна и соблюстись транзитивность рабочая ++ и тест длл(#) успешна. еще вариант, назовем его оптронная развязка, если он возможен по архитектуре. из ++ нативного, вы вызываете в определенный момент программу на #, параметры передаете командной строкой. все дышат равномерно каждый в своем процессе. Если данных для передачи ну очень много, заливайте из ++ натива в файл, а запущенной консолью на диезе или демоном следите за изменением этого файла тут тоже разные изолированные процессы. такой то примитив на ++ можно исполнить не зная всех тонкостей языка. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 20:42 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Где-то в степи, ну да, решение начинается с постановки задачи ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2014, 20:48 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
Сообщу, к каким выводам я пришел. Цепочка Код: plaintext
Буду делать так: запущу, как тут советовали, отдельный процесс (C#), а данные буду передавать по UDP. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2014, 20:35 |
|
Как вызвать C#-метод из managed C++
|
|||
---|---|---|---|
#18+
КапюшонСообщу, к каким выводам я пришел. Цепочка Код: plaintext
Буду делать так: запущу, как тут советовали, отдельный процесс (C#), а данные буду передавать по UDP. схема рабочая при правильном приготовлении зачем udp - анонимные пайпы кошернее будут ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2014, 22:18 |
|
|
start [/forum/topic.php?fid=20&tid=1402821]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 196ms |
0 / 0 |