当前位置:编程学习 > C#/ASP.NET >>

C#调用vc++的dll时 返回包含字符串的结构体出现的问题

再VC++的Dll中定义了struct如下
typedef struct{
char gamename[10];    //在这我试了string 然后c#中改为string 也不行
char gameversion[10];
} GameInfoX;

定义了一个函数 返回自定义的结构体GameInfoX,函数名没改

extern "C" __declspec(dllexport) GameInfoX  add(int a,int b)
{
GameInfoX ss;
strcpy(ss.gamename,"1");
strcpy(ss.gameversion,"2");
return ss;
}

然后我再我的web application中
public struct  GameInfoX
{
         [MarshalAs(UnmanagedType.ByValTStr, SizeConst=10)]
public String gamename;  //这里string 和char[]都试过了
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=10)]
         public String gameversion;
}
。。。。
[DllImport("WCInfo.dll",EntryPoint="add")]
public static extern GameInfoX  add(int a,int b);
。。。。
//调用
GameInfoX gi;
gi= add(3,5);
Response.Write(gi.gamename); 

总是出现“方法的类型签名与 PInvoke 不兼容。”的错误
网上搜索了也找不到结果。

所以想问一下 如果vc++返回的结构体包含char[]或者string的话应该怎么解决呢? --------------------编程问答-------------------- 期待高手解决 --------------------编程问答-------------------- 怎么没有高手出现呢 --------------------编程问答-------------------- 用stringbuilder试试,或者加ref out关键字 --------------------编程问答-------------------- stringbuilder先把空间分配了,在传进去 --------------------编程问答-------------------- 有没有具体一点的代码?小弟初学 --------------------编程问答-------------------- 改为
public struct  GameInfoX
{    
         public StringBuilder gamename; 
         public StringBuilder gameversion;
}
还是一样 --------------------编程问答-------------------- 改为
public struct  GameInfoX
{    
         public StringBuilder gamename; 
         public StringBuilder gameversion;
}

GameInfoX g;
g.gamename = new StringBuilder(256); 
g.gameversion= new StringBuilder(256); 
分配好内存后再传进去 --------------------编程问答-------------------- 还是不行 

错误如下

方法的类型签名与 PInvoke 不兼容。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.Runtime.InteropServices.MarshalDirectiveException: 方法的类型签名与 PInvoke 不兼容。

源错误: 


行 104: g.gameversion= new StringBuilder(256); 
行 105:
行 106: g = add(3,5);
行 107: //Response.Write(contents); 
行 108: Response.Write(g.gamename); 
 

源文件: c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs    行: 106 

堆栈跟踪: 


[MarshalDirectiveException: 方法的类型签名与 PInvoke 不兼容。]
   WebApplication1.WebForm1.add(Int32 a, Int32 b) +0
   WebApplication1.WebForm1.Button1_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs:106
   System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   System.Web.UI.Page.ProcessRequestMain()

 
--------------------编程问答-------------------- 难道想从c++里穿个带字符串的结构给c#这么难吗? --------------------编程问答-------------------- 在线等 --------------------编程问答-------------------- 朋友你的问题解决了吗 --------------------编程问答-------------------- 感觉应该把结构体作为函数的参数返回 --------------------编程问答-------------------- 在c#中用intptr 来代替数组试试 ,然后string   str   =   System.Runtime.InteropServices.Marshal.PtrToStringUni(ptr)
将指针转换成string --------------------编程问答-------------------- 这么写
public   struct     GameInfoX 

       [MarshalAs(UnmanagedType.ByValArray,   SizeConst=10)] 
       public   char[] gamename; 

       [MarshalAs(UnmanagedType.ByValArray,   SizeConst=10)] 
       public   char[] gameversion; 

补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,