我有一个实现一些 API 的本机 DLL。C++ 标头如下所示:
class CAPIInterface
{
public:
virtual int __stdcall Release()=0;
virtual LPCSTR __stdcall ErrorDescription(const int code)=0;
virtual int __stdcall Login(const int login,LPCSTR password)=0;
}
在 C++ 中,以这种方式获取指向接口的指针:
typedef int (*APICreate_t)(int version,CAPIInterface **api);
pfnAPICreate =reinterpret_cast<APICreate_t>(::GetProcAddress(hlib,"APICreate"));
CAPIInterface *api=NULL;
if(pfnAPICreate) (*pfnAPICreate)(version,&api);
接口的方法调用如下:
api->Login(123,"password");
现在我需要加载这个原生 DLL 并在我的 C# 程序中使用 API。我设法以这种方式加载 DLL 并获取指向本机接口的指针:
public static class GlobalMembers
{
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate int APICreate_t(time_t version, out IntPtr api);
}
ptr_pfnAPICreate = NativeMethods.GetProcAddress(hlib,"APICreate");
pfnAPICreate = (GlobalMembers.APICreate_t)Marshal.GetDelegateForFunctionPointer(ptr_pfnAPICreate, typeof(GlobalMembers.APICreate_t));
pfnAPICreate(version, out mptr);
但现在我不确定如何将此指针 (mptr) 映射到接口的 C# 实现。另外我也不确定如何在 C# 中声明接口 CAPIInterface。我尝试以这种方式声明接口:
[StructLayout(LayoutKind.Sequential)]
public class CAPIInterface
{
public delegate int Release();
public delegate string ErrorDescription(int code);
public delegate int Login(int login, string password);
}
但是它没有编译......它返回这个错误:错误3不可调用成员'CAPIInterface.Login'不能像方法一样使用。我知道代表也必须在某个地方实例化......但是怎么做呢?如上所述声明 CAPIInterface 是否正确?