clover82625
clover82625
采纳率33.3%
2019-02-11 10:33 阅读 547

如何写一个托管和非托管下都能编译成功的C++结构体,方便在不同环境下调用?

5

不懂C++,请各位高手指点一下。
需求是需要封装一个动态库,方便C#调用C++对应结构体,该结构体也应用于静态库,代码如下:

//A.h
#ifdef DOTNET
#define TEST_STRUCT(name) [StructLayoutAttribute(LayoutKind::Sequential, Pack = 1)]\
    typedef public ref struct name
#else
#define TEST_STRUCT(name) typedef struct name
#endif
    TEST_STRUCT(A)
    {
            unsigned char Count;
            B* DataList;
            A()
            {
                    Count = 0;
                    DataList = NULL;
            }
            ~A()
            {
                    if (DataList != NULL)
                    {
                                delete [] DataList;
                                DataList = NULL;
                    }
            }       
            bool copy(char* input, unsigned long count, char* pMem, unsigned long ulMemCount)
            {
                    DataList = new B[Count];
                    memcpy(DataList, &input[6], Count*8);
                    return true;
            }
    }A
    ```
    ```

我创建了一个C++ 动态库工程
代码如下:

// TestCLI.h

#include "..\A.h"

#ifndef DOTNET
#define DOTNET;
#endif

#pragma once


然后在工程内引入A.h
编译时,

B* DataList;

会报错。
应该如何改造呢?

补充一下,之所以要引用A.h,是想着两边用一套就可以满足,因为这个库是个协议库,后续要不断的往里面补充,为了方便,想着写一个.h, 然后引入两个工程中分别编译就可以了,不需要写两套那么麻烦。
有办法实现吗?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2019-02-11 12:42

    分别在托管和非托管环境下定义两个,只要托管的类型封送是正确的两者就兼容了。
    不要在结构体内使用类,定义方法、代码之类的。这些可以放在结构体外面。

    点赞 评论 复制链接分享

相关推荐