如何在C#中引用非托管(非COM)接口?

时间:2013-03-29 03:19:21

标签: c# pointers interface unmanaged

我有一个正在实现某些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是否正确?

1 个答案:

答案 0 :(得分:0)

我能够在SWIG的帮助下将我的C ++ API转换为C#。它很棒。谢谢。