Как вызвать объект ref класса в c неуправляемой dll из c #

Я пытаюсь вызвать c ++ Umnamanged DLL Ref. Объект класса из приложения C #. Вызов функции DLL, работающей с VC ++.

Мой код VC ++ выглядит следующим образом

class  METHOD_TYPE CDeskApi
{
public:
CDeskApi(void);

/*
Description : Initiates a connection to NEST system
Parameters  : 1. serialkey provided to implement the api
2. object of CDeskApiCallback implemented

Return      : 0 in case of success and -1 in case of error
*/
int Initialise(char *serialkey, CDeskApiCallback* callback);
/*
Description : Request data from the server
Parameters  : 1. symbol of interest
2. intervals of 1 min, multiples of 1 min, DAILY_PERIOD in case of daily.
3. data to be retrieved from. in no of seconds since epoch
4. identifier, which is returned in the callback
Return      : 0 in case of success and -1 in case of error
*/

~CDeskApi(void);
};

class METHOD_TYPE CDeskApiCallback
{
public:
};class Myhandler : public CDeskApiCallback
{
public:

virtual int quote_notify( const char* symbol, int size, Quotation *pQuotes, unsigned long echo)
{
return 0;
};
};

Myhandler handler;

void Cnest_desk_appDlg::OnBnClickedOk()
{
if(odesk.Initialise("VWAP", &handler))
{
AfxMessageBox("Error!");

return;//error
}
}

и мой код C # выглядит следующим образом

[DllImport("DeskApi.dll", EntryPoint = "?Initialise@CDeskApi@@QAEHPADPAVCDeskApiCallback@@@Z")]
static extern void DeskApiInitialize(IntPtr symbol, callback fn);

private delegate int callback(IntPtr symbol, int nMaxSize, ref Quotation pQuotes, ulong echo);

private callback mInstance;

private void btnFetch_Click(object sender, EventArgs e)
{
IntPtr ptrCString = (IntPtr)Marshal.StringToHGlobalAnsi(txtFetch.Text);

CallTest.DeskApiGetQuote(ptrCString,quote_notify);

Marshal.FreeHGlobal(ptrCString);
}

private int quote_notify(IntPtr symbol, int nMaxSize, ref Quotation pQuotes, ulong echo)
{
return 0;
}

В C # все работает нормально, но не вызывает quote_notify функционировать?

0

Решение

Это полный код? Я сомневаюсь в этом, потому что у вас даже нет никаких методов в CDeskApiCallback (который, по-видимому, является некоторым интерфейсным классом, предназначенным для обратных вызовов). В любом случае объект «обратного вызова» C ++ сильно отличается от делегата .NET, и именно так вы пытаетесь его использовать.

Еще одним существенным недостатком является то, что вы пытаетесь импортировать dll-метод в C ++ (CDeskApi :: Initialise). Эта часть будет работать нормально, но как вы собираетесь создать экземпляр класса C ++, чтобы вы могли вызывать Initialise для него?

Я уверен, что вы могли бы как-то начать работать с P / Invoke, но для этого лучше подойдут COM или C ++ / CLI. Любые классы и интерфейсы COM или C ++ / CLI будут непосредственно видны C # без необходимости написания странных инструкций по маршаллингу в коде C #.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]