powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов делегата из unmanaged кода в .Net 2.0
4 сообщений из 4, страница 1 из 1
Вызов делегата из unmanaged кода в .Net 2.0
    #33603451
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше когда писали в .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
Вызов делегата из unmanaged кода в .Net 2.0
    #33606507
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код, который в .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
Вызов делегата из unmanaged кода в .Net 2.0
    #33608386
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman...Вобщем в функции doProgress я 3 раза вызываю делегат а на четвертом приложение падает....

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


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


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


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