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#