日期:2014-05-17  浏览次数:20832 次

【山之魂】高分求助:C++怎么传递列表给C#?
本人这几天在做一个项目,现有一个DICOM查询功能的C++DLL,其中有导出类(导出类,不是导出函数,有源代码),
我的工作是用C#调用这个C++将查询到的患者列表显示出来(我是做C#的老菜鸟,C++完全不懂)。
现在遇到的问题是,导出类的函数中要用到类成员对象,但是C#只能对其进行静态调用,无法初始化C++类对象。
我想到的方法是将C++导出类再进行封装,用一个导出函数实现查询功能,
又遇到一个问题,C++用什么返回类型来返回患者列表信息?
C++没有array,ArrayList什么的,甚至不能返回数组(只能返回数组的指针,但是C#不支持指针)。
查过很多资料都没有办法解决。
请各位C++、C#的大虾帮忙,非常感谢。
时间比较紧。
分我不会吝惜的,近期发的帖子都是200分的,比如
http://topic.csdn.net/u/20120724/21/995f94f2-aa80-43ca-96cf-79e822bc33d5.html?seed=2130642648&r=79335479#r_79335479

------解决方案--------------------
c++原型是什么
------解决方案--------------------
1.若是类多的话,可以考虑使用托管C++做个中间封装。

2.使用结构体对C++的类进行封装

3.使用COM组件。
PS:
你们DICOM通信部分是使用DCMTK吗?

查询部分可以使用C#来完成呀。
------解决方案--------------------
本帖最后由 bdmh 于 2012-08-07 11:43:32 编辑
如果是c++自己的类导出,那c#用不了,可以像4楼说的,再封装一层,暴漏一些通用接口供c#使用
------解决方案--------------------
C++没有array,ArrayList什么的,甚至不能返回数组(只能返回数组的指针,但是C#不支持指针
对你这句话绝对的不认同
1.STL中有很多的集合对象,能够返回集合,例如放入到vector<string>中,返回
2.C# 也支持指针,放到 unsafe 代码块中
------解决方案--------------------
1.封装成COM组件。对C++不是很熟,尤其是COM方面,自己找资料吧……
2.导出函数封装一些功能。建议返回值用作错误处理,传入/传出都用参数,比如结构数组或者结构指针:

DLL_EXPORT_API int Query(AStruct * output, int outputLength);

C#方使用

[DllImport("dll.dll", EntryPoint = "Query", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        internal static extern int StructArrayTest([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1), Out()]AStruct[] output, int outputLength);

封送。内存尽量在调用方(即C#方)申请和释放,dll导出函数中尽量不用malloc/new为佳。
------解决方案--------------------
引用:
引用:
c++原型是什么

非托管C++代码,其中有个导出类,里面有几个函数,还有类成员,函数里面要用到类成员,功能是查询DICOM患者列表。

工作电脑不能上网,没法贴出来。

难道你只会复制粘贴?用U盘拷贝或者直接写在纸上,回家后手工输入一遍。
------解决方案--------------------
如果你只是要类型转换,推荐你一个非常好的工具:
P/Invoke Interop Assistant

在最后一个标签页里贴入C++头文件代码(或仅部分定义)
点击下面Generate就可以产生C#对应的定义了。
------解决方案--------------------
C#支持指针,用指针写即可,很方便
------解决方案--------------------
引用:
回 bdmh,我也意识到需要再封装,现在的问题是用什么返回类型来返回多条患者信息。

谢谢 kingdom_0 ,我对C++一窍不通,可以写一小段代码给我演示 vector<string> 的使用么?

C++代码中也有struct,可是我不知道怎么把C#和C++的struct对照起来(C++的struct中有指针成员),哪位大哥帮忙写个例子,非常感谢!


Vector使用例子:
#include "stdafx.h"
#include<string>
#include<vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
vector<string> strs;
strs.push_back("1");
strs.push_back("2");
strs.push_back("3");
strs.push_back("4");
for(int i=0;i<strs.size();i++)
{
prin