读书人

C#中调用C++dll的有关问题!

发布时间: 2013-09-29 11:07:08 作者: rapoo

C#中调用C++dll的问题!!急。。。。。。。
这里是C++中声明的头文件

struct AIS{
int type;
long mmsi;
float turn;
char status[10];
};
extern int _stdcall ReturnAIS(const char *buf,struct AIS* ais);

这是函数的定义:
int _stdcall ReturnAIS(const char *buf,AIS *ais)
{
ais->type=11;
ais->mmsi=987654321;
ais->turn=11.1111;
strcpy(ais->status,buf);
return 0;
}


这里是C#导入的代码
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct AIS
{
public int type;
public int mmsi;
public float turn;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string status;
//public byte[] status;

}

[DllImport("dlldemo.dll", EntryPoint = "ReturnAIS", CharSet = CharSet.Auto)]
public static extern int ReturnAIS(string buf, ref AIS ais);
//public static extern int ReturnAIS(char[] buf, ref AIS ais);

这是C#函数里调用函数的代码
 Console.WriteLine("---------------TEST ReturnAIS------------");
string status = "222222222";
CFuns.AIS aisout = new CFuns.AIS();
int r = CFuns.ReturnAIS(status,ref aisout);
Console.WriteLine("{0}\n{1}\n{2}\n{3}\n",aisout.type,aisout.mmsi,aisout.turn,aisout.status);
Console.ReadKey();


小弟的问题是 为什么在输出的时候aisout这个结构体里面的成员status并不是“222222222”却只是一个”2“呢,就是只是字符串的第一个字符。是哪个地方弄错了么?急啊,求教大神。。。。。。 c#? dll c++ c# string
[解决办法]
顶!!一下,同求!
[解决办法]
char.auto => char.ansi.
[解决办法]
其实楼主你可以用 c++cli 直接调用就可以了

c++cli 内部可以直接混合托管和非托管 包装好的类c#这边看就是 c#的类了
例如下面的包装好 c#就可以通过它这样调用了 要不然c++的函数有一些更奇葩的 会出现更奇葩的问题


#include <vcclr.h>
namespace Test
{

struct AIS{
int type;
long mmsi;
float turn;
char status[10];
};
public ref Class Wraper
{
public:
Wraper();
~Wraper();
!Wraper();
void Test(String^ str )
{
pin_ptr<const char> ch = PtrToStringChars(str);
AIS ais;
ReturnAIS(ch,&ais);
}

}

}



这样调用也可以的 对于一些用c# 调用c++dll复用过去的相关代码比较容易一些

读书人网 >C#

热点推荐