Как вызвать C#-метод из managed C++

Капюшон
Дата: 05.06.2014 18:39:04
Перечитал кучу форумов, пробовал — ничего не помогает.
Ситуация следующая. Есть программа, назовем ее Читалка. Она открывает текстовые файлы.
При смене страницы Читалка вызывает определенную функцию dll (это настраивается) и передает номер страницы.
В С++ данный метод выглядит так:
int _stdcall GotoPage(int page)

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

обычный:
Commander^ commander = gcnew Commander;
commander->WriteTest();

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

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

— не помогло!
Где-то в степи
Дата: 05.06.2014 18:58:59
Капюшон,
возможно ваша сборка С# не соответствует обще языковой спецификации, разные языки хотя и тянут кони из одного места
проверьте наличие атрибута в сборке http://msdn.microsoft.com/ru-ru/library/system.clscompliantattribute(v=vs.110).aspx
это то что пришло в голову первое, хотя я думал компилятор будет подсказывать такие нюансы, а он что молчит?
Капюшон
Дата: 06.06.2014 10:15:24
Где-то в степи,

Добавил
[assembly: CLSCompliant(true)]
[assembly: ComVisible(true)]


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


— не помогло. Компилятор молчит, компилирует успешно.
Где-то в степи
Дата: 06.06.2014 10:55:35
Капюшон,
Может загрузить сборку C# отдельным доменом на хост и исследовать, ведь что то должно загрузиться,
к сожалению я в цейтноте, вечером могу попробовать..
Капюшон
Дата: 06.06.2014 11:03:08
Что значит «отдельным доменом на хост»??
Где-то в степи
Дата: 06.06.2014 11:21:50
Капюшон,
У вас ведь простое виндовс приложение работающее с clr, так вот clr организовано как com который является хост средой для размещения всех net сборок, к стати там есть различия по загрузке от номера фремвока, по умолчанию создается основной домен
( выгружается при умирании всего приложения), можно создать в контексте еще домен, и в ручную подгрузит сборку, так как домены изолированы ( общение через маршалинг) то при ненадобности можно отгрузить новый домен, а в заместо него создать еще один и подгрузить нужные библиотеки ( как то так по быстрому)
Где-то в степи
Дата: 06.06.2014 20:28:14
Капюшон,
создал решение С# dll
+

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#
+

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;
}


в общем все заработало по дефолту..
Капюшон
Дата: 08.06.2014 13:57:01
Спасибо, попробовал так же сделать — действительно работает!
Но цепочка
Читалка → С++ dll → C# dll
тем не менее не работает.
Буду разбираться дальше...
Где-то в степи
Дата: 08.06.2014 14:06:15
Капюшон,
автор
Читалка-> С++ dll -> C# dll

в данном случае PInvoke , и не забывать выбрать соответствующую модель освобождения стека в С++
автор
Читалка -> С++(CLR) dll -> C# dll

а это мс крайне не рекомендует!!!
Где-то в степи
Дата: 08.06.2014 14:10:49
Я рассмотрел выше вариант доступ к неуправляемому или управляемому но написанному под C++(crl) из длл C#