Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов делегата из unmanaged кода в .Net 2.0 / 4 сообщений из 4, страница 1 из 1
15.03.2006, 18:52
    #33603451
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов делегата из unmanaged кода в .Net 2.0
Раньше когда писали в .Net 1.1 вот этот код работал прекрасно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;
#pragma managed

public __delegate void Progress(int);

#pragma unmanaged
class UnmClass {
public:
	void test(Progress* proc);
};

#pragma managed
void UnmClass::test(Progress* proc) {
	for (int i= 0 ; i< 10 ; i++) {
		proc(i);
	}
}


#pragma managed
public __gc class MgClass {
public:
	MgClass() {}
	void touch(int var);
};

//#pragma unmanaged
void MgClass::touch(int var) {
	System::Console::WriteLine("{0}", __box (var) );
}

int _tmain()
{
    // TODO: Please replace the sample code below with your own.
	UnmClass *pUnm=new UnmClass();
	MgClass *pMg=__gc new MgClass();
	Progress *pProg=__gc new Progress(pMg,&MgClass::touch);
	pUnm->test(pProg);
	return  0 ;
}

сейчас что-то, в .Net 2.0 я никак не врублюсь что нужно чтобы это заработало? Кто-нить сталкивался?
...
Рейтинг: 0 / 0
16.03.2006, 19:26
    #33606507
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов делегата из unmanaged кода в .Net 2.0
Вот код, который в .Net 2.0 "почти" работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
// delegat-test3.cpp : main project file.

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream"
#include "string"

#include <vcclr.h>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;


#pragma managed
public delegate void Progress(int i);
public ref class MClass {
public:
	long i;
	MClass() {}
	~MClass() {}
	void progress(int i) {
		System::Console::WriteLine("Delegate {0}",i);
	}
};

#pragma unmanaged
typedef void (*PROGRESSCALLBACK)(int);
class UClass {
public:
	UClass() {
		cout << "UClass Constructor" << endl;
	}
	~UClass() {
		cout << "UClass desctructor" << endl;
	}
	void doProgress (PROGRESSCALLBACK fn);
};


void UClass::doProgress (PROGRESSCALLBACK fn) {
	//for (int i=0;i<100;i++) {
	//	cout << "Invoke delegate: " << endl;
	fn( 1 );
	fn( 2 );
	fn( 3 );
	fn( 4 );
	fn( 5 );
}


#pragma managed
int main(array<System::String ^> ^args)
{
	UClass *pUClass=new UClass();
	MClass^ pMClass=gcnew MClass;

	GCHandle gh1=GCHandle::Alloc(pMClass);
	Progress^ dlg=gcnew Progress(pMClass,&MClass::progress);

	IntPtr ip=Marshal::GetFunctionPointerForDelegate(dlg);	
	PROGRESSCALLBACK fnptr=(PROGRESSCALLBACK)(ip.ToPointer());
	pUClass->doProgress(fnptr);
	GC::Collect();
	
	gh1.Free();
	
    Console::WriteLine(L"Hello World");
    return  0 ;
}

Вобщем в функции doProgress я 3 раза вызываю делегат а на четвертом приложение падает....

ДА ЗДРАВСТВУЕТ КОМПАНИЯ MICROSOFT! Благодяря которой многие годы производители лекарств от геморроя скоро станут самыми богатыми людьми планеты!
...
Рейтинг: 0 / 0
17.03.2006, 15:17
    #33608386
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов делегата из unmanaged кода в .Net 2.0
gardenman...Вобщем в функции doProgress я 3 раза вызываю делегат а на четвертом приложение падает....

честно говоря - ручками не смотрел (лень если честно - тяпница). Но мысли следующии....
1) делегат - это вектора кол бэков, насколько вьезжаю в сей механизм..
2) подписаться со стороны си бимоля мы можем не определённое кол-во раз...
3) вызывать нуна столько раз (имееться ввиду разные вектора) - сколько было подписей на ентот самый делегат...


ну где то так...
далее думаю дебаг и(или) мсдн Вам помогут...
как лакмуссавая бамажка - думаю сойдёт разное кол-во подписей на ентот самый делегат из си бимоля...а не только 3 (насколько я вьезжаю)...


с уважением
(круглый)
...
Рейтинг: 0 / 0
20.03.2006, 13:41
    #33611864
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов делегата из unmanaged кода в .Net 2.0
Делегат - это все навсего (грубо говоря) метод экземпляра конкретного класса, callback функция. Все это из-за дибильного мусоросборщика в .Net. У меня не получилось запинить (pin_ptr) указатель на функцию или на класс. А в MSDN сказано что типа должно работать. : (((
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов делегата из unmanaged кода в .Net 2.0 / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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