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

不懂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, 然后引入两个工程中分别编译就可以了,不需要写两套那么麻烦。
有办法实现吗?
c++

1个回答

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

caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复clover82625: 非托管的写一套,托管的包装下,好比调用api函数
7 个月之前 回复
clover82625
clover82625 因为这个库是个协议库,后续要不断的往里面补充,为了方便,想着写一个.h, 然后引入两个工程中分别编译就可以了,不需要写两套那么麻烦。 有办法实现吗?
7 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
怎样在非托管环境里调用托管DLL
c#.net生成的dll可以在非托管环境下调用吗?rn我生成过一个DLL,可是用DLL查看器却发现里面没有接口函数,是我生成的DLL有问题还是根本就不能调用?rn谢谢
c++/cli 如何对非托管结构体进行调用,非托管如何调用托管结构体
想问各位高手,本人想写个系统框架,系统中各个功能由别人实现,我给别人提供的是这样一个结构体如:rnstruct Imagernrn void * pData;rn int length;rn BYTE typeFlg;rn long size;rn;rn我读这些数据的时候都是用的托管的数据类型和方法,但是暴露给别人的接口是这样一个标准c++的结构体我想请问我应该如何写别人可以调用我这样的结构体rn另外别人给我传这样一个结构体时,我应该如何调用转为托管下可以使用的类型。rn请各位能给出详细解释,最好能给点源代码参考下
托管?非托管?
使用vc.net编写类库,但是我想在这里面调用win32 api,这样,编译器说出错!
托管和非托管
参考: https://blog.csdn.net/suhuaiqiang_janlay/article/details/6004909 https://www.cnblogs.com/dudu-miao/ https://www.cnblogs.com/loverswordsman/articles/1367131.html https://blog.csdn.net/shanxuezhe/ar...
[求助] 在非托管的环境里面如何调用托管的DLL呢!
rn我在用VC6.0 里面调用C# 写的托管的DLL。这是一个网上目前研究比较少的一个方向。rnrn我想请问一下,这里有没有高手能够,解决这个问题rnrnMSN: vcbcbida@yahoo.com.cn
非托管c++中如何调用托管c#编译的dll?
生成的dll怎么才能调用阿?急
C和C++在结构体和类方面的不同
这里将C和C++写的顺序表的部分代码列出来作以对比: 本质是一样的,C写一个显示的形参,C++不用,C++把顺序表的信息数据传给PushBack函数了,只不过是编译器在做,把数据传给了隐含的this指针。表层:面向过程,数据和方法是分离的。面向对象,数据和方法是封装在一起的。
托管,非托管的区别?
是不是VC++6.0编的程序都是托管性的?rnC#.Net编的都是非托管性的代码?rn在VC.Net上,编写的MFC程序在生成前,都会被提醒:过时?并询问是否要升级?rn那么,升级后的MFC程序是不是就已经被升级为非托管性的了?rn托管与非托管,是不是针对目标机上是否存在.Net运行时环境而言呢?rn请各位赐教。。我想要详尽的解释。。rn
什么叫托管和非托管?
在vb.net的一些文章,我经常看到一些像“托管代码”和“非托管代码”以及“托管资源”和“非托管资源”等一些词语,请各位高手告诉我这个菜鸟。
托管和非托管的界定???
假如A类中数据成员分别是string ,hashtable等这个类就应该是托管的!!!rn对这个类实现IDisposable有必要吗???
结构体数组非托管到托管
C++中的一个函数,rn第一个参数是个结构体数组.rn原C++程序在用的时候就是新建一个数组直接传进来,并不是传指针.rnrn我在C#中怎么用托管来表示呢?rnrn这个试半天了没搞定rnrn//C++函数如下rn//VOID WINAPI PaintInView(rn //sPnt pntTypeArray[], rn //int arrSize, rn //CDC *pDC, rn //int rcWidth, rn //int rcHeight,rn //double central_x,rn //double central_y, rn //int level=0,rn //enPTIVflag ptivflag=PTIV_R2PSMP);
如何用非托管c++调用托管c++?
我自己建托管c++库工程,里面写了个托管c++的类,如何能在非托管工程的rnc++代码中调用这个托管的类啊?我查了下msdn , 里面有篇 An Overview of Managed/Unmanaged Code Interoper 文章讲了几种交互方法,但是没有具体过程和事例代码.请各位指点下啊.
托管 vs 非托管
从网上整理的一些关于Managed Code和Native Code的区别,大家学习一下吧,我觉得内容还可以吧,可能是知道的不多吧。。。
托管C++中调用 非托管C++的DLL
查了一些资料,能查到的都是C#的,但是还没有很理解,而且在自己的CLR工程里也不通,我是想调用非托管的DLL,C#里说是要用System::Runtime::InteropServices;在使用DLL里的函数之前,要声明rn[DllImport("function.dll")] rnpublic static extern int MF_Getsnr(int mode, int halt, [In]byte[] snr, [In]byte[] value);rnrn要设置DLL路径、名字,要与DLL中函数名称、返回值、参数列表的类型完全一样,进行一些转换,但是还是不行。rnrn应该怎么调用非托管的DLL?
非托管类 调用 托管类 问题
请问各位,我想在一个非托管的类中 放一个 托管类的类型的 变量 ,gcroot str可以 ,gcroot form 怎么不可以呢 ?rnrn如果 要在 非托管类中,添加一个 From类型的 变量 ,该怎么做?rnrn谢谢rnrn
托管调用非托管的DLL问题,急!!!
有一个classrn public __gc class CMP_APDlg : public System::Windows::Forms::Formrn rn public: rn CMP_APDlg(void)rn rn InitializeComponent();rn rn int InitialAudioCapture();rnrn CRITICAL_SECTION m_CS;rn protected: rn void Dispose(Boolean disposing)rn rn if (disposing && components)rn rn components->Dispose();rn rn __super::Dispose(disposing);rn rn rn private:rn System::ComponentModel::Container* components;rn void InitializeComponent(void)rn rn this->components = new System::ComponentModel::Container();rn this->Size = System::Drawing::Size(300,300);rn this->Text = S"MP_APDlg";rn rn ;rnrnrnrn int CMP_APDlg::InitialAudioCapture()rn rn InitializeCriticalSection(&m_CS);rn return 0;rn rnrn提示错误:rnrne:\Temp\Vc\VivitekMonitor\VivitekMonitorSource\MP_APDlg.cpp(421): error C2664: “InitializeCriticalSection” : 不能将参数 1 从“CRITICAL_SECTION __gc *”转换为“LPCRITICAL_SECTION”rnrnrn请问该如何解决啊?rnrnrnrn
托管和非托管的c++区别
     托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。     托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using  DLL命名空间,来调用相应的DLL对象 。     非托管DLL文件,在Dotnet环境应用时,通过 DllIm...
如何区分托管和非托管
如题...
托管-非托管类型转换问题
char[] cmddata=CmdData.ToString().ToCharArray();rnchar *head=(char *)cmddata;rnrnerror: 无法将类型“char[]”转换为“char*”rnrnrn对于一个已经分配并按照一个struct赋值的内存,C++可以用指针直接按照struct的结构取得其数据,C#怎么实现?
问一个VC。NET托管和非托管的问题。
我用.NET的时间不多,用C#,发现C#写的代码几秒钟就是 别人的了,所以想接触下VC++.net,因为它可以写非托管代码。我想问的是,在非托管代码里,VC还能用。NET的库吗?是不是非托管代码编译的EXE是直接执行的(我看内存消耗就是),如果非托管是不能用。NET里面的东西,那么VC7和VC6有什么区别?只是MFC的升级?要不就哪位直接给我解析下非托管和托管的区别也成。
不同文件结构体调用
aaa.h文件中有rntypedef structrnrn WORD wLeft;rn WORD wTop;rn WORD wRight;rn WORD wBottom;rn AW_RECT, *PAW_RECT;rnrnrnbbb.h文件中的结构体中某一个数据的类型就是AW_RECT rnrntypedef structrn AW_RECT input_win; rn AW_RECT merge_win; rnrnAW_MERGE_SET,*PAW_MERGE_SET;rnrnrn编译报错rnrn肿么改 rn
非托管dll引用,函数结构体调用报错
int read (int nDevHandle, const OpParam *pReaderParam, DealReport *func)rntypedef structrn rn unionrn ReadParam tReadParam;rn WriteParam tWriteParam;rn op;rn unsigned int a;rn unsigned short b;rn unsigned short c;rnOpParamElement;rn以上代码如何转化成c#的结构体???急急
托管和非托管是什么意思啊?
请问VC中的托管和非托管是什么意思啊?两者有何区别?
托管和非托管是什么意思呢?
托管和非托管是什么意思呢?
托管,非托管混合编程出现的问题
先是出现这些:rn LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/OPT:ICF”规范)rn LINK : warning LNK4089: /OPT:REF 已丢弃所有对“OLEAUT32.dll”的引用rn LINK : warning LNK4089: /OPT:REF 已丢弃所有对“ole32.dll”的引用rn 警告;rnrn然后在处理时,托管函数调用非托管函数出现错误。rnrn上述是在Release下出现的错误,而在Debug下程序执行都没有任何错误。rnrn谢谢!rn
请问一下托管和非托管什么意思?
刚学,不懂,请教。
托管和非托管之间数据类型转换问题
1、如何将非托管BYTE 转换为托管的 Byternrnbool CDlg::Func1(BYTE* aszData)rnrn return false;rnrnrnbool CDlg::Func2(BYTE* aszData)rnrn Byte Data[] = GetData(); rn return Func1(Data); error 不能将参数 1 从“unsigned char __gc[]”转换为“BYTE *”rnrn
非托管字符串和托管字符串的转换
目前.net非常流行,但它是托管的,因此很多时候要与非托管代码通信,本例展示了非托管字符串和托管字符串之间的相互转换
非托管程序能否调用托管的dll?如何调用?
如题
C#托管和非托管+代码互操作
http://blog.sina.com.cn/s/blog_3e51bb390102vv6b.html
C#调用VC dll (托管调用非托管) OPC
大家好,这几天正在研究OPC.服务器端做完了,现在要做一个客户端,我用的是自动化接口OPCDAAuto.dll.rn但是遇到一个问题,就是C#调用OPCDAAuto.dll的非托管函数时,老是出现"参数不正确"的异常.rn被调用的函数:rn HRESULT SyncRead(rn [in] SHORT Source,rn [in] LONG NumItems,rn [in] SAFEARRAY(LONG) * ServerHandles,rn [out] SAFEARRAY(VARIANT)* Values,rn [out] SAFEARRAY(LONG)* Errors,rn [out,optional] VARIANT* Qualities,rn [out,optional] VARIANT* TimeStampsrn );rnrnC#调用代码:rn[color=#FF0000]//下面这段代码有问题,SyncRead出现异常[/color]int[] serverHandles=new int []item.ServerHandle;rnSystem.Collections .ArrayList al=new ArrayList ();rnal.AddRange (serverHandles);rnSystem.Array Handles=al.ToArray (System.Type .GetType ("System.Int32"));rnrnSystem.Array values;rnSystem.Array errors;rnobject quality;rnobject timestamp;rnrngroup.SyncRead ((short)OPCAutomation.OPCDataSource .OPCDevice,1,ref Handles,out values,out errors,out quality,out timestamp);rnrn这是我的程序.请求大家帮助
如何写一个结构体啊?
我的资料全不在身边,什么都不方便rn想写一个结构体,可以格式给忘了,rn呵呵 麻烦各位
编译和运行的环境不同
我编写了一个共享库so的代码,在一台AIX主机上编译没问题,但是在使用这个共享库的AIX主机上编译报错,请问我如果用编译通过的共享库在编译报错的主机上使用会有风险吗?现在是这个共享库在WINDOWS环境下没有什么问题,但是在AIX环境下使用发现了内存泄露。
.net cf环境下vb.net调用非托管程序
各位,我准备在.net cf构架下使用vb.net来调用EVC4写的一个DLL,但是怎么调用都不行。如果使用同样的构造(函数),在.net 环境下,使用.net 来调用vc写的DLL却可以调用,一直没有找到解决方法(就是同样一段算法在vc下编译后再在vb.net 环境下来调用就可以,真的是好奇怪。rn不知在.net cf构架下怎么来调用EVC4.0编写的DLL,希望大家给点指点。rn
如何将从Socket接受的非托管字节流转化成托管结构,还有就是如何将托管结构体转成非托管字节流从Socket发送
结构定义如下:rn[StructLayout(LayoutKind.Sequential)]public struct ACDTP_RECEIVE_HEADrn rn [MarshalAs(UnmanagedType.U4)]rn public uint PktLength;rn [MarshalAs(UnmanagedType.U4)]rn public uint PktType;rn;rnrnrn就是说如何将一个Byte数组如何转化为以上的结构,不能 用序列化,因为我们是和别人的平台通讯。rn
Ubuntu环境下编译so-jni调用c语言
首先确保电脑要安装了jdk和gcc编译环境。 1.这是我写的一个Java程序: public class TestJNI { static{ System.loadLibrary("diaoyong"); //程序在加载时,自动加载libdiaoyong.so库 } public native void
c#调用托管dll如何申请非托管内存传给c++
求问各位大神,在c++采用托管的方式生成一个dll,这是c++的函数:rn[code=csharp]test::test(byte** src, int fileNum,int Min)[/code]rn在debug模式下,采用start debug without debug不会出错,但是在release模式下,采用start debug without debug报试图访问被保护的内存的错误。怀疑是在release情况下,test函数在运行的情况下,c#端的资源因为是托管,被GC回收了。rn在c#端我是用fixed的方法获取指针,如下:rn[code=csharp]byte*[] result = new byte * [len];rnfor()rn//.......rnfixed (byte* p = &re[0])rn rn result[k] = p;rn rnrnrn fixed (byte** pData = result)rnrn return pData;rn[/code]rn请问在c#端如何将资源存储的内存改变为非托管,然后传给c++?
请问如何在非托管c++下调用托管c#动态库呀
听说有三种方法
非托管的C++DLL中可否调用托管的C++DLL,怎样使用
请教各位
托管类调用非托管类(C#,C++,CLI,传递指针数组)
开发工具Visual Studio 2008 步骤: 1 启动Visual Studio 2008,新建CLR类库,如图: 2 在CLR_DLL.h输入代码如下(注意代码书写的顺序): // CLR_DLL.h #pragma once using namespace System; namespace CLR_DLL { //非托管类 class UClass{ publi...
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池