我正在尝试调用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 :(得分:0)
那是完整的代码吗?我对此表示怀疑,因为你甚至没有CDeskApiCallback中的任何方法(可能是一些类似接口的类用于回调)。无论哪种方式,C ++“回调”对象与.NET委托非常不同,这就是你尝试使用它的方式。
另一个主要缺陷是你正在尝试dll导入一个C ++方法(CDeskApi :: Initialise)。那部分工作正常,但你如何实例化C ++类,以便你可以调用它?
我确信你可以以某种方式使用P / Invoke,但为了这个目的,COM或C ++ / CLI会更好。 C#可以直接看到任何COM或C ++ / CLI类和接口,而无需在C#代码中编写奇怪的编组指令。