c#返回接口由DllExport编写

本文关键字:DllExport 编写 接口 返回 | 更新日期: 2023-09-27 18:12:09

我试图返回有关数据加密的接口UnmanagedExports

这里是我的代码:

    public class Crypter : ICrypter
    {
    public bool Encrypt(IntPtr data)
    {
        /* Sorry I Can't Show How I Do This */
        Marshal.Copy(encdata, 0, data, encdata.Length);
        return true;
    }
    public bool Decrypt(IntPtr data)
    {
        /* Sorry I Can't Show How I Do This */
        return true;
    }
}
public interface ICrypter
{
    bool Encrypt(IntPtr data);
    bool Decrypt(IntPtr data);
}

我的导出函数:

    [DllExport("CreateCrypter", CallingConvention.Cdecl)]
    public static ICrypter CreateCrypter()
    {
        return new Crypter();
    }

:

class ICrypter
{
 public:
    virtual int testFunc1();
    virtual int testFunc2();
 private:
};

这里是Wrapper

typedef ICrypter*(*CreateCrypter)();
HMODULE mylib = LoadLibrary(L"C:''Users''Moien''Documents''Visual Studio 2013''Projects''UnmanagedInterfaces''MyLibrary''bin''Debug''MyLibrary.dll");

代码之后,我使用GetProcAddress和测试我的添加函数,以确保我的函数导出,但我调用CreateCrypter和我的程序崩溃的

求助于(http://code4k.blogspot.ae/2010/10/implementing-unmanaged-c-interface.html)

    public static IntPtr GetInterfacePointer(Delegate[] functions)
    {
        // Allocate object layout in memory 
        // - pointer to VTBL table
        // - following that the VTBL itself - count of functions
        IntPtr nativePointer = Marshal.AllocHGlobal(IntPtr.Size * (1 + functions.Count()));
        // virtual table
        IntPtr vtblPtr = IntPtr.Add(nativePointer, IntPtr.Size);
        Marshal.WriteIntPtr(nativePointer, vtblPtr);
        for (int i = 0; i < functions.Count(); i++)
        {
            Marshal.WriteIntPtr(IntPtr.Add(vtblPtr, IntPtr.Size * i),
                Marshal.GetFunctionPointerForDelegate(functions[i]));
        }
        return nativePointer;
    }

c#返回接口由DllExport编写

求助于(http://code4k.blogspot.ae/2010/10/implementing-unmanaged-c-interface.html)

public static IntPtr GetInterfacePointer(Delegate[] functions)
{
    // Allocate object layout in memory 
    // - pointer to VTBL table
    // - following that the VTBL itself - count of functions
    IntPtr nativePointer = Marshal.AllocHGlobal(IntPtr.Size * (1 + functions.Count()));
    // virtual table
    IntPtr vtblPtr = IntPtr.Add(nativePointer, IntPtr.Size);
    Marshal.WriteIntPtr(nativePointer, vtblPtr);
    for (int i = 0; i < functions.Count(); i++)
    {
        Marshal.WriteIntPtr(IntPtr.Add(vtblPtr, IntPtr.Size * i),
            Marshal.GetFunctionPointerForDelegate(functions[i]));
    }
    return nativePointer;
}