如何从c#中调用c非托管dll中的类ref对象

时间:2013-02-05 09:25:22

标签: c# c++ visual-c++ unmanaged

我正在尝试调用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 函数?

1 个答案:

答案 0 :(得分:0)

那是完整的代码吗?我对此表示怀疑,因为你甚至没有CDeskApiCallback中的任何方法(可能是一些类似接口的类用于回调)。无论哪种方式,C ++“回调”对象与.NET委托非常不同,这就是你尝试使用它的方式。

另一个主要缺陷是你正在尝试dll导入一个C ++方法(CDeskApi :: Initialise)。那部分工作正常,但你如何实例化C ++类,以便你可以调用它?

我确信你可以以某种方式使用P / Invoke,但为了这个目的,COM或C ++ / CLI会更好。 C#可以直接看到任何COM或C ++ / CLI类和接口,而无需在C#代码中编写奇怪的编组指令。