我的解决方案里面有两个项目,一个是MFC项目,一个是C#项目,现在需要在C#里面调用C++类的函数,C++里已经定义了#define PNC_API extern "C" __declspec(dllexport)以下的C++函数是我需要在C#里面调用的:
PNC_API long RegisterClient(const PLAYOUTNODE& node, u_long svrIP, u_short svrport, IClientCallback* pCallback = NULL, void* act = NULL, u_short localUdpPort = 0); PNC_API int UnregisterClient(long idClient); PNC_API bool IsClientRegistered(long idClient); PNC_API int SendNetMessage(long idClient, u_long dst, u_long msg, const char* data, int len); PNC_API int SendP2PNetMessage(long idClient, u_long dstip, u_short dstport, u_long msg, const char* data, int len);谁知道怎么在C#里面写相应的函数原型?(就是[DllImport("PNC.dll")]修饰的函数怎么写)
请大家帮帮忙,感激不尽.

解决方案 »

  1.   


    [DllImport( "PNC.dll", EntryPoint = "RegisterClient" )]
    public static extern long RegisterClient ( PLAYOUTNODE node, ulong svrIP, uint svrport, delegateEvent pCallback, object act, int localUdpPort );
    [DllImport( "PNC.dll", EntryPoint = "UnregisterClient" )]
    public static extern int UnregisterClient(long idClient );
      

  2.   

    IClientCallback这是啥类型 ?
    class 么?
      

  3.   


    class IClientCallback
    {
    public:
    virtual void OnRegistered(long idClient, void* act) = 0;
    virtual void OnSvrClosed(long idClient, void* act) = 0;
    virtual void OnNetMessage(long idClient, void* act, const PLAYOUTNODE& src, 
    u_long dst, u_long msg, const char* data, int len) = 0;
    virtual void OnP2PNetMessage(long idClient, u_long ip, u_short port, void* act, const PLAYOUTNODE& src,
    u_long msg, const char* data, int len){}
    };
      

  4.   

    如果IClientCallback是class类型的话,你还是再弄一个C++/CLI工程做中转。
    C# 调用 C++/CLI
    C++/CLI调用C++
    这样比较容易解决。
      

  5.   


    C# 调用Win32的Dll,参数对应很头疼。谢谢楼上提醒,我去找找C++/CLI方面的资料。
      

  6.   


    网上搜了半天资料,看了C# 调用 C++/CLI 的相关文章,不过对C++/CLI还是不熟悉,这种方式只有放弃了。还是回到平台调用上来,用p/invoke实现,不过难点在于PNC_API long RegisterClient(const PLAYOUTNODE& node, u_long svrIP, u_short svrport, IClientCallback* pCallback = NULL, void* act = NULL, u_short localUdpPort = 0); 这个函数中有一个IClientCallback×类型的参数,是一个class类型,详见5楼。我如何在c#里面传递这样一个参数呢?是在C++里面再做一个包装,还是在C#里面写个IClientCallback类呢?这个IClientCallback类应该是个事件类吧,1楼的处理方式当作委托,这样好像不行吧?
      

  7.   


    最快的解决办法是用C++/CLI,一般不会出问题
    用PInvoke的话很麻烦,还不一定能成功。再说一下这是非标准DLL,即使用C++/CLI也不一定能成功。