clover82625 2019-02-11 10:33 采纳率: 33.3%
浏览 580
已结题

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

不懂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条回答 默认 最新

  • threenewbee 2019-02-11 12:42
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 CSS实现渐隐虚线边框
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题