powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как вызвать C#-метод из managed C++
24 сообщений из 24, страница 1 из 1
Как вызвать C#-метод из managed C++
    #38662892
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал кучу форумов, пробовал — ничего не помогает.
Ситуация следующая. Есть программа, назовем ее Читалка. Она открывает текстовые файлы.
При смене страницы Читалка вызывает определенную функцию dll (это настраивается) и передает номер страницы.
В С++ данный метод выглядит так:
Код: plaintext
1.
int _stdcall GotoPage(int page)


Всё работает, эта функция выполняется.
Мне нужно, чтобы этот метод С++ вызывал, в свою очередь , метод C#. Обращаю внимание, что С++ приложение — managed (/clr) написано в VS 2010.
И в моем солюшене есть два проекта: С++ с вышеперечисленным методом и C#.
я пытаюсь вызвать методы C# из функции С++ следующими способами:
статический:
Код: plaintext
1.
Video::VideoCommander::WriteTest();


обычный:
Код: plaintext
1.
2.
Commander^ commander = gcnew Commander;
commander->WriteTest();


— всё компилируется, НО в run-time даже этот С++ метод не вызывается, как будто его нет! Само собой, до C# дело вообще не доходит!
Если я комментирую эти вызовы C#, то всё опять работает!
Если я напишу
Код: plaintext
1.
2.
System::DateTime now = System::DateTime::Now;
fprintf(filepointer," TEST  %d:%d:%d\n", now.Hour, now.Minute, now.Second);


— то это работает! Хотя System::DateTime — это .NET метод!
В чем может быть дело?
я даже добавил в С++:
Код: plaintext
1.
2.
using namespace Video;
#using <D:\DEV\CPP\VideoCommander\bin\Debug\VideoCommander.dll>


— не помогло!
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38662904
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
возможно ваша сборка С# не соответствует обще языковой спецификации, разные языки хотя и тянут кони из одного места
проверьте наличие атрибута в сборке http://msdn.microsoft.com/ru-ru/library/system.clscompliantattribute(v=vs.110).aspx
это то что пришло в голову первое, хотя я думал компилятор будет подсказывать такие нюансы, а он что молчит?
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38663214
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Добавил
Код: c#
1.
2.
[assembly: CLSCompliant(true)]
[assembly: ComVisible(true)]



Также пометил классы:
Код: c#
1.
2.
3.
4.
5.
   [CLSCompliantAttribute(true)]
  [ComVisible(true),
  Guid("037269fa-40b2-4473-9ebc-0de105ea5e0a"),
  Description("...")
  ]



— не помогло. Компилятор молчит, компилирует успешно.
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38663264
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
Может загрузить сборку C# отдельным доменом на хост и исследовать, ведь что то должно загрузиться,
к сожалению я в цейтноте, вечером могу попробовать..
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38663277
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит «отдельным доменом на хост»??
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38663313
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
У вас ведь простое виндовс приложение работающее с clr, так вот clr организовано как com который является хост средой для размещения всех net сборок, к стати там есть различия по загрузке от номера фремвока, по умолчанию создается основной домен
( выгружается при умирании всего приложения), можно создать в контексте еще домен, и в ручную подгрузит сборку, так как домены изолированы ( общение через маршалинг) то при ненадобности можно отгрузить новый домен, а в заместо него создать еще один и подгрузить нужные библиотеки ( как то так по быстрому)
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664128
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
создал решение С# dll

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
namespace ClassLibrary1
{
    public class Class1
    {
        public int ValueInt(int i)
        {
            return i;
        }
        public string ValueString(string i)
        {

            
            return i;
        }

        public char[] ValueArray(string i)
        {
            return i.ToCharArray();
        }
    }
}



создал консоль C++
прицепил к ней длл C#

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
using namespace System;
using namespace ClassLibrary1;
int main(array<System::String ^> ^args)
{
	Class1^ cl = gcnew Class1();
	int gg=cl->ValueInt(2);
	Console::WriteLine(gg);
	String^ str="fdsfsdfsdf";
	String^ res=cl->ValueString(str);
	Console::WriteLine(res);
	Array ^ ar=cl->ValueArray(str);
	for each (Char var in ar)
	{
		Console::Write(var);
	}
	return 0;
}



в общем все заработало по дефолту..
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664610
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробовал так же сделать — действительно работает!
Но цепочка
Код: plaintext
Читалка → С++ dll → C# dll
тем не менее не работает.
Буду разбираться дальше...
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664612
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
авторЧиталка-> С++ dll -> C# dll
в данном случае PInvoke , и не забывать выбрать соответствующую модель освобождения стека в С++
авторЧиталка -> С++ (CLR) dll -> C# dll
а это мс крайне не рекомендует!!!
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664614
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я рассмотрел выше вариант доступ к неуправляемому или управляемому но написанному под C++(crl) из длл C#
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664668
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается, у меня как раз второй, не рекомендуемый вариант:
Код: plaintext
Читалка -> С++ (CLR)  dll -> C# dll

Правда, я не понял, почему он не рекомендуется.

То есть, получается, надо заморачиваться с PInvoke...
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664677
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
Я не знаю, на многих постах в стаковерфлейм встречал рассуждение что не рекомендуется
из C# таскать исполнение из кода написанного на с++(clr).
может да ну его ++, а написать библиотеку на шарпе ( это тоже самое, только проще)
ну если вы не очень с ним дружите, то естественно что лучше для вас писать на чистом с++
а вызывать исполняемый код через PInvoke, эта та технология обыденная и публичная.
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664679
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиЯ не знаю, на многих постах в стаковерфлейм встречал рассуждение что не рекомендуется
из C# таскать исполнение из кода написанного на с++(clr).
писатели скорее просто не справились
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664680
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
У меня вообще недоумение от вашего поста.
Сначала Вы испытывали проблемы: использование функционала библиотеки написанной на C# в коде С++
Когда вы этот вопрос решили, у вас возникла проблема - наоборот ( по использованию кода)
У вас что это тренинг такой? как бы такие желания в реальный проект мало укладываются.
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664681
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,

ещё раз - имеется обычное с++ приложение, обращается к managed c++ dll, которая в свою очередь обращается к c# dll?
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664682
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
не знаю, попробую позднее, ради интереса ...
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664683
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилКапюшон,

ещё раз - имеется обычное с++ приложение, обращается к managed c++ dll, которая в свою очередь обращается к c# dll?
так он же я так понял решил ее.
авторСпасибо, попробовал так же сделать — действительно работает!
прицепляй к прокси библиотеку Video, и работай без всяких ограничений..
???
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664687
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

на мой взгляд - самый простой способ с++ native -> c#
использовать IDispatch ( с небольшим костылём, позволяющим обойтись без регистрации COM)
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664727
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подождите, ребята,

Эта задача не тестовая и не учебная, а совершенно реальная, рабочая. И я ее пока не решил. У меня получилось лишь успешно проверить пример с С++ Console + C# dll.

Смотрите, ситуация такая. Есть приложение — Читалка. Можно ее так настроить, чтобы при наступлении определенных событий она вызывала функции предоставленной dll. Это работает, есть пример с С++ dll.
Я С++ знаю плохо, и хочу перевести вызов в C# как можно быстрее. Пока этого у меня не получилось.

Где-то в степи предложил сразу написать библиотеку на C# — но разве такое возможно??
Есть программа DLL Export Viewer — она позволяет «увидеть» содержимое dll — мне не удалось написать библиотеку на C#, которую «было бы видно извне». А вот библиотеку С++ видно без проблем.
Если бы удалось написать такую штуку сразу на C# — это было бы просто чудесно!
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664730
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон Где-то в степи предложил сразу написать библиотеку на 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
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664746
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон,
что то я запутался.
авторСмотрите, ситуация такая. Есть приложение — Читалка. Можно ее так настроить, чтобы при наступлении определенных событий она вызывала функции предоставленной dll. Это работает, есть пример с С++ dll.
теперь вы берете пример ++ управляемом и пытаетесь вызвать функционал из линкованной С# у вас не получается?
вообще то если получилось с консолью и простой длл диеза получится и выше, прилинкуйте к длл диеза( тестовой) вашу рабочую диезную длл video( так вроде она называлась выше) и работай те через прокси ( тестовая длл диеза), я может мудрено объясняю
если консоль ++ и тест длл(#) успешна
должна и соблюстись транзитивность
рабочая ++ и тест длл(#) успешна.
еще вариант, назовем его оптронная развязка, если он возможен по архитектуре.
из ++ нативного, вы вызываете в определенный момент программу на #, параметры передаете командной строкой.
все дышат равномерно каждый в своем процессе.
Если данных для передачи ну очень много, заливайте из ++ натива в файл, а запущенной консолью на диезе или демоном
следите за изменением этого файла тут тоже разные изолированные процессы.
такой то примитив на ++ можно исполнить не зная всех тонкостей языка.
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38664751
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

ну да, решение начинается с постановки задачи
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38668604
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сообщу, к каким выводам я пришел.
Цепочка
Код: plaintext
Читалка → С++ dll → C# dll
не работает по всей видимости по той причине, что приложение Читалка написано на чистом С++ (unmanaged).
Буду делать так: запущу, как тут советовали, отдельный процесс (C#), а данные буду передавать по UDP.
...
Рейтинг: 0 / 0
Как вызвать C#-метод из managed C++
    #38668645
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КапюшонСообщу, к каким выводам я пришел.
Цепочка
Код: plaintext
Читалка → С++ dll → C# dll
не работает по всей видимости по той причине, что приложение Читалка написано на чистом С++ (unmanaged).
Буду делать так: запущу, как тут советовали, отдельный процесс (C#), а данные буду передавать по UDP.

схема рабочая при правильном приготовлении

зачем udp - анонимные пайпы кошернее будут
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как вызвать C#-метод из managed C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]