Re[3]: 2 вопроса по C# и [DllImport]
От: Mab Россия http://shade.msu.ru/~mab
Дата: 02.10.05 09:07
Оценка: +1
Здравствуйте, gokiburi, Вы писали:

G>есть, таже dll при использовании совместно с C++ приложением нормально работает и не ругается..

Почти наверняка пропущено extern "C".
2 вопроса по C# и [DllImport]
От: gokiburi  
Дата: 02.10.05 08:45
Оценка:
1. возможно ли как-нить использовать классы из обычной dll в C#?
такое
[DllImport( "TestDLL.dll" )]
        public static extern class CNetClient;

естественно не работает.
Есть ли какой-нить способ добиться возможности использования классов из dll?
2. в dll есть функция:

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif

extern TESTDLL_API int getNetworkHandle(void);

импортирую:

[DllImport( "NetClient.dll" )]
        public static extern int getNetworkHandle();
static void main( string[] args ) {
 // вызываю импортируемую функцию
 int netH = getNetworkHandle();
}

и волучаю exception — говорит нет точки входа в dll...
где грабли?
Re: 2 вопроса по C# и [DllImport]
От: Mab Россия http://shade.msu.ru/~mab
Дата: 02.10.05 08:52
Оценка:
G>1. возможно ли как-нить использовать классы из обычной dll в C#?
DLL вообще не может экспортировать классы. По крайней мере переносимого между компиляторами способа это сделать нет.

G>Есть ли какой-нить способ добиться возможности использования классов из dll?

Нет. Пишите раперы.

G>и волучаю exception — говорит нет точки входа в dll...

G>где грабли?
Раз говорит, значит действительно нет Возьмите depends и посмотрите таблицу экспорта.
Re[2]: 2 вопроса по C# и [DllImport]
От: gokiburi  
Дата: 02.10.05 08:59
Оценка:
Здравствуйте, Mab, Вы писали:

G>>1. возможно ли как-нить использовать классы из обычной dll в C#?

Mab>DLL вообще не может экспортировать классы. По крайней мере переносимого между компиляторами способа это сделать нет.

Ну переносимость в общем-то не требуется..

G>>Есть ли какой-нить способ добиться возможности использования классов из dll?

Mab>Нет. Пишите раперы.

Можно сделать например в dll-ке функцию которая будет возвращать указатель на объект и это будет работать?...

G>>и волучаю exception — говорит нет точки входа в dll...

G>>где грабли?
Mab>Раз говорит, значит действительно нет Возьмите depends и посмотрите таблицу экспорта.

есть, таже dll при использовании совместно с C++ приложением нормально работает и не ругается..
Re[3]: 2 вопроса по C# и [DllImport]
От: Mab Россия http://shade.msu.ru/~mab
Дата: 02.10.05 09:05
Оценка:
Здравствуйте, gokiburi, Вы писали:

G>Можно сделать например в dll-ке функцию которая будет возвращать указатель на объект и это будет работать?...

Объект из DLL -- совершенно чужеродное понятие для .NET. Максимум чего можно будет добиться -- представлять эти объекты в виде IntPtr. Ну и вызывать далее в стиле SomeClass_SomeMethod(obj, arg0, arg1, ...).

G>есть, таже dll при использовании совместно с C++ приложением нормально работает и не ругается..

Имя не должно быть mangled, т.е. буквально нужно иметь "getNetworkHandle".

Я не телепат. Если действительно требуется помощь, то нужен минимальный компилирующийся пример, воспроизводящий проблему.
2 вопроса по C# и [DllImport]
От: Аноним  
Дата: 02.10.05 20:23
Оценка:
В принципе невозможно экспортировать классы из unmanaged dll библиотек, но можно следующие :
у класса, который мы хотим экспортировать объявить интерфейс на подобие COM, естественно с виртуальными функциями и затем его передать в при помощи какой-либо функции :

/************* c++ code ********************/
interface ISomeClassData
{
virtual int GetData();
virtual void SetData();
virtual int GetErrorCode();
}

class SomeClassData : ISomeClassData
{
/* реализация данного класса */
}

ISomeClassData* CreateSomeClassObject()
{
return new SomeClassData();
}

__declspec(dllexport) ISomeClassData* CreateSomeClassObject();

/*****************************************/


/**************** cs code *******************/

public interface ISomeClassData
{
int GetData();
void SetData();
int GetErrorCode();
}

public class SomeClassDataFactory
{
[DllImport("SomeClassLibrary.dll")]
public static extern ISomeClassData CreateSomeClassObject();
}

и работаем как с c# объектом

/**********************************************/

Данный пример можно расширить, например если в dll реализовать функцию автоматической регистрации подобных классов и вывода их списков при помоще некоторой функции :

struct CLASS_EXPORT_INFO
{
wchar_t *ClassName;
GUID IdClass;

CLASS_EXPORT_INFO *NextClass;
}

CLASS_EXPORT_INFO* GetExportedClasses();

,а также фабрику классов при помощи

interface ISomeInterface
{
}

ISomeInterface* CreateClassFromId( GUID guid );

и т.д. и т.п. Хотя использовать COM будет более эффективнее чем данный метод.
Любое сложное решение — проявление лени человека, которому это поручили


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.