首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-09-29 
C#中调用C++dll的问题!!急。。。。。。。这里是C++中声明的头文件struct AIS{int typelong mmsifloat turnchar

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复用过去的相关代码比较容易一些

热点排行