C++代码转换为C#

rainlove2010 2012-04-23 09:04:25
大家好,请教一个问题,希望可以帮忙,有一段C++代码,我想转换为C#的,因为我对C++不熟悉,所以实现有点困难,请各位帮忙,希望不甚赐教,在这里学习了。

C++代码如下:
typedef CMyList<PER_HANDLE_CONTEXT*,PER_HANDLE_CONTEXT > Contextlist;

下面是定义的类CMyList:
template <class theCL,class CL>
class CMyList
{
public:
//创建一个list容器的实例LISTINT
typedef list<theCL> myList;

// typedef list<int (*callback)(int,char*)> myList;

CMyList(void);
~CMyList(void);

int LinkCount;
myList useList;
myList BakList;

//销毁
void DestroyList();
//重置为空表
void ClearList();
//加在头节点
BOOL AddFirst(theCL e);
//加在头节点
BOOL AddBakFirst(theCL e);
//加在尾节点
BOOL AddLast(theCL e);
//取得头
theCL GetFirst();
//取得尾部
theCL GetLast();
//移除头
BOOL RemoveFirst();
//移除尾部
BOOL RemoveLast();
//第i个位置之前插入
BOOL InsertAt(int i,theCL e);
//删除第I个
BOOL ListDelete(int i);
//元素的数量
int GetCount();
//取得第i个元素
theCL GetAt(int i);
//删除元素
BOOL ListDelete(theCL e);
BOOL SetAt(int i,theCL e);
//取得头
theCL GetBakFirst();
BOOL RemoveBakFirst();
//元素的数量
int GetTempCount();
};

...全文
1215 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainlove2010 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
C++指针定义就是C#的类对象定义,而你的sockaddr_in定义为了结构体,这样使用起来就比较麻烦,因为C#处理结构体时按照值类型处理的,而不是引用地址,如果一定要用到地址的场合,建议改写为class。
另外你的数据类型对应有误,C++的long不是C#的long,C++的long是C#的int,这里有数据类型对照表,自己看:http://www.cnblogs.com/yiki/archi……
[/Quote]
谢谢解答。
rainlove2010 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
抱歉上面最后一部分的代码写错了。是这样的:
-------------------------------------------------------------------------


那么在C#中typedef怎么实现的呢?C#中虽然没有typedef关键字,但是C#中有using。

所以,C++代码

C/C++ code

typedef CMyList<PE……
[/Quote]
谢谢回复。
qldsrx 2012-04-25
  • 打赏
  • 举报
回复
C++指针定义就是C#的类对象定义,而你的sockaddr_in定义为了结构体,这样使用起来就比较麻烦,因为C#处理结构体时按照值类型处理的,而不是引用地址,如果一定要用到地址的场合,建议改写为class。
另外你的数据类型对应有误,C++的long不是C#的long,C++的long是C#的int,这里有数据类型对照表,自己看:http://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
rainlove2010 2012-04-25
  • 打赏
  • 举报
回复
非常感谢大家的回答,我想再请教一下,C++中有以下两个结构体:
1.typedef struct sockaddr_in {
short sin_family;
ADDRESS_FAMILY sin_family;
USHORT sin_port;
IN_ADDR sin_addr;
CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

2.
typedef struct _WSABUF {
ULONG len;
__field_bcount(len) CHAR FAR *buf;
} WSABUF, FAR * LPWSABUF

有这样的代码,把lpcallerid->buf强制转换成sockaddr_in型指针赋值给pcaller,如下:
sockaddr_in* pCaller=(sockaddr_in*)lpCallerId->buf;

下面是我转化为C#后的结构体
1.public struct sockaddr_in
{
short sin_family;
ushort sin_port;
in_addr sin_addr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public char[] sLibNamesin_zero;
}
2. public struct WSABUF
{
public long len;
public string buf;

}

但是我不知道sockaddr_in* pCaller=(sockaddr_in*)lpCallerId->buf;
转换成C#要如何转化呢?
谢谢!
宝_爸 2012-04-23
  • 打赏
  • 举报
回复
创建一个cli的工程(Other language ->Visual C++ -> CLR下面项目模板),把C++代码放进去。
再增加managed的接口,调用内部C++功能,并供外面调用。

不用转换。
kuohai 2012-04-23
  • 打赏
  • 举报
回复
怎么都是函数的声明。
YapingXin 2012-04-23
  • 打赏
  • 举报
回复
抱歉上面最后一部分的代码写错了。是这样的:
-------------------------------------------------------------------------


那么在C#中typedef怎么实现的呢?C#中虽然没有typedef关键字,但是C#中有using。

所以,C++代码

typedef CMyList<PER_HANDLE_CONTEXT*,PER_HANDLE_CONTEXT > Contextlist;

在C#中的using代码段中,这样表示:

using Contextlist = CMyList<PerHandleContext, PerHandleContext>;


然而CMyList是个abstract class,注意在初始化的时候应该初始化为一个实例化的CMyList类。
例如:
假设MyList类是CMyList的实例化类:

namespace DemoClassLibrary
{
using Contextlist = CMyList<PerHandleContext, PerHandleContext>;

/// <summary>
/// TODO: Update summary.
/// </summary>
public class Demo
{
public void foo()
{
Contextlist contextList = new MyList<PerHandleContext, PerHandleContext>();
}
}
}


YapingXin 2012-04-23
  • 打赏
  • 举报
回复
这个问题是这样的:

首先,转换这一部分代码:


template <class theCL,class CL>
class CMyList
{
public:
//创建一个list容器的实例LISTINT
typedef list<theCL> myList;

// typedef list<int (*callback)(int,char*)> myList;

CMyList(void);
~CMyList(void);

int LinkCount;
myList useList;
myList BakList;

//销毁
void DestroyList();
//重置为空表
void ClearList();
//加在头节点
BOOL AddFirst(theCL e);
//加在头节点
BOOL AddBakFirst(theCL e);
//加在尾节点
BOOL AddLast(theCL e);
//取得头
theCL GetFirst();
//取得尾部
theCL GetLast();
//移除头
BOOL RemoveFirst();
//移除尾部
BOOL RemoveLast();
//第i个位置之前插入
BOOL InsertAt(int i,theCL e);
//删除第I个
BOOL ListDelete(int i);
//元素的数量
int GetCount();
//取得第i个元素
theCL GetAt(int i);
//删除元素
BOOL ListDelete(theCL e);
BOOL SetAt(int i,theCL e);
//取得头
theCL GetBakFirst();
BOOL RemoveBakFirst();
//元素的数量
int GetTempCount();
};


转换成C#,就是这样的:


using System.Collections.Generic;

/// <summary>
/// TODO: Update summary.
/// </summary>
public abstract class CMyList<theCL, CL>
{
public CMyList()
{
}

~CMyList()
{
}

public int LinkCount;
public List<theCL> useList;
public List<theCL> BakList;

public abstract void DestroyList();
public abstract void ClearList();
public abstract bool AddFirst(theCL e);
public abstract bool AddBakFirst(theCL e);
public abstract bool AddLast(theCL e);
public abstract theCL GetFirst();
public abstract theCL GetLast();
public abstract bool RemoveFirst();
public abstract bool RemoveLast();
public abstract bool InsertAt(int i, theCL e);
public abstract bool ListDelete(int i);
public abstract int GetCount();
public abstract theCL GetAt(int i);
public abstract bool ListDelete(theCL e);
public abstract bool SetAt(int i, theCL e);
public abstract theCL GetBakFirst();
public abstract bool RemoveBakFirst();
public abstract int GetTempCount();
}


注意我把整个类定义成了abstract类,因为原C++类只有虚方法。


然后,对于:

typedef CMyList<PER_HANDLE_CONTEXT*,PER_HANDLE_CONTEXT > Contextlist;


我没有看到 PER_HANDLE_CONTEXT 的定义,所以我添加了一个空的C#类PER_HANDLE_CONTEXT:


public class PerHandleContext
{
}


然后,对于

typedef CMyList<PER_HANDLE_CONTEXT*,PER_HANDLE_CONTEXT > Contextlist;

PER_HANDLE_CONTEXT* 和 PER_HANDLE_CONTEXT 转换成C#时我准备都用C#类PerHandleContext,因为,在C#中类成员是以引用的方式来使用的,所以天生就是一个指针。

那么在C#中typedef怎么实现的呢?C#中虽然没有typedef关键字,但是C#中有using。

所以,C++代码

typedef CMyList<PER_HANDLE_CONTEXT*,PER_HANDLE_CONTEXT > Contextlist;

在C#中,就是形如下面这样的用法:


namespace DemoClassLibrary
{
using Contextlist = CMyList<PerHandleContext, PerHandleContext>;

public class Demo
{
public void foo()
{
Contextlist = new Contextlist();
//......
//......
}
}
}
qldsrx 2012-04-23
  • 打赏
  • 举报
回复
你给的代码不完整,只给了类的定义,没有类中方法的实现,实现代码在cpp文件中,不给全没法帮你转换。

[Quote=引用 2 楼 的回复:]

创建一个cli的工程(Other language ->Visual C++ -> CLR下面项目模板),把C++代码放进去。
再增加managed的接口,调用内部C++功能,并供外面调用。

不用转换。
[/Quote]
没那么简单的,即使添加CLR支持,那代码也是非托管代码,要使用CLR特殊的怪异语法改写才能直接给C#调用,我写过,真的很怪异,外加VS2010不支持CLR的智能语法提示,这对他来说,难度比直接改写C#更大,所以不现实。
然鸟 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

创建一个cli的工程(Other language ->Visual C++ -> CLR下面项目模板),把C++代码放进去。
再增加managed的接口,调用内部C++功能,并供外面调用。

不用转换。
[/Quote]

你的方法不错,不知道能否能够在调用者和被调用者之间实现数据传递啊?双方能够识别吗?

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧