如何将对象指针从DLL传递到DLL

本文关键字:DLL 指针 对象 | 更新日期: 2023-09-27 18:24:50

我是一名经验丰富的软件工程师,但对C#有些陌生。我有一个DLL,它是由带有C接口的C++对象组成的,如图所示。我使用这个C接口是因为我不确定是否有办法从我的C#应用程序访问DLL中的C++入口点。

   __declspec(dllexport) void *Constructor();
   __declspec(dllexport) void Destructor(void *pObj);
   __declspec(dllexport) int Method(void *pObj, char *pSrcDst, int len);

这是上述接口的C代码。

extern "C" void *Constructor()
{
   return (void *)new Object;
}
extern "C" void Destructor(void *pObj)
{
   delete (Object *)pObj;
}
extern "C" int Method(void *pObj, char *pSrcDst, int len)
{
   if (!pObj) return 0;
   return ((Object *)pObj)->Method(pSrcDst, len);
}

到目前为止还不错。现在,我需要能够从C#应用程序访问这个接口。根据我所学到的,我已经实现了下面的C#接口。

   unsafe public class Wrapper
   {
      [SuppressUnmanagedCodeSecurityAttribute()]
      [DllImport("MyDLL.dll")]
      public static extern
         IntPtr Constructor();
      [SuppressUnmanagedCodeSecurityAttribute()]
      [DllImport("MyDLL.dll")]
      public static extern
         void Destructor(IntPtr pObj);
      [SuppressUnmanagedCodeSecurityAttribute()]
      [DllImport("MyDLL.dll")]
      public static extern
         int Method(IntPtr pObj, [In,Out] byte[] pSrcDst, int len);

下面是使用上述接口的C#代码。

  private IntPtr pObject;
  public object()
  {
     pObject = Wrapper.Constructor();
  }
  ~object()
  {
     Wrapper.Destructor(pObject);
  }
  public override byte[] method()
  {
     byte[] bytes = new byte[100];
     int converted = Wrapper.Method(pObject, bytes, bytes.length);
     return bytes;
  }

代码在对Wrapper.Method和Wrapper.Destructor的调用中都断言。我认为我没有正确处理指向对象的指针。有什么建议吗?

如何将对象指针从DLL传递到DLL

最可能的问题是您的代码没有使用正确的调用约定。在C++中,默认值是__cdecl,但对于DllImport,默认值为__stdcall

要解决此问题,请明确指定调用约定:

[DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]

我觉得做这类事情的最佳方式是使用托管的c++/CLI包装器。

正在创建简单的c++.net包装器。逐步

http://devmaster.net/forums/topic/7357-how-to-build-a-net-wrapper-for-a-c-library/

看起来很有前景。