C#中调用C++dll的问题!!急。。。。。。。

谁动了我的凌枫 2013-09-12 05:17:26
这里是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“呢,就是只是字符串的第一个字符。是哪个地方弄错了么?急啊,求教大神。。。。。。
...全文
182 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhaoloen 2013-09-25
  • 打赏
  • 举报
回复
这个是在C#下用的你用一下就知道了
  • 打赏
  • 举报
回复
引用 4 楼 yuhaoloen 的回复:
其实楼主你可以用 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复用过去的相关代码比较容易一些
没有用过CLI感觉这个是在C++下用的额。。。。
yuhaoloen 2013-09-13
  • 打赏
  • 举报
回复
其实楼主你可以用 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复用过去的相关代码比较容易一些
  • 打赏
  • 举报
回复
引用 2 楼 Saleayas 的回复:
char.auto => char.ansi.
你好,通过你的办法顺利解决问题 顺便问一下,charset代表什么意思啊,就解释,谢谢!
Saleayas 2013-09-12
  • 打赏
  • 举报
回复
char.auto => char.ansi.
shangdf88 2013-09-12
  • 打赏
  • 举报
回复
顶!!一下,同求!

110,534

社区成员

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

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

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