日期:2014-05-18  浏览次数:20880 次

C#调用C++类API(C#,MFC复合项目)
我的解决方案里面有两个项目,一个是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")]修饰的函数怎么写)
请大家帮帮忙,感激不尽.



------解决方案--------------------
C# code

[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 );

------解决方案--------------------
探讨
C# code
[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 );

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

最快的解决办法是用C++/CLI,一般不会出问题
用PInvoke的话很麻烦,还不一定能成功。

再说一下这是非标准DLL,即使用C++/CLI也不一定能成功。