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...
где грабли?
G>1. возможно ли как-нить использовать классы из обычной dll в C#?
DLL вообще не может экспортировать классы. По крайней мере переносимого между компиляторами способа это сделать нет.
G>Есть ли какой-нить способ добиться возможности использования классов из dll?
Нет. Пишите раперы.
G>и волучаю exception — говорит нет точки входа в dll...
G>где грабли?
Раз говорит, значит действительно нет

Возьмите depends и посмотрите таблицу экспорта.
Здравствуйте, Mab, Вы писали:
G>>1. возможно ли как-нить использовать классы из обычной dll в C#?
Mab>DLL вообще не может экспортировать классы. По крайней мере переносимого между компиляторами способа это сделать нет.
Ну переносимость в общем-то не требуется..
G>>Есть ли какой-нить способ добиться возможности использования классов из dll?
Mab>Нет. Пишите раперы.
Можно сделать например в dll-ке функцию которая будет возвращать указатель на объект и это будет работать?...
G>>и волучаю exception — говорит нет точки входа в dll...
G>>где грабли?
Mab>Раз говорит, значит действительно нет
Возьмите depends и посмотрите таблицу экспорта.
есть, таже dll при использовании совместно с C++ приложением нормально работает и не ругается..
В принципе невозможно экспортировать классы из 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
ссылка на оригинальное сообщение