use*_*336 6 c# c++ visual-studio
感觉就像我的问题类似于此.
到目前为止,我有一个在C++中定义的结构,如下所示:
typedef struct struct_type1
{
uint64 nameLen;
char * name;
} STATUSSTRUCT;
Run Code Online (Sandbox Code Playgroud)
和一个定义为的函数:
extern int _stdcall getStatus(STATUSSTRUCT * status);
Run Code Online (Sandbox Code Playgroud)
并且可能是这样的功能:
int _stdcall getStatus(STATUSSTRUCT * status)
{
status->nameLen = someLength;
status->name = someName;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我实际上无法更改C++代码(出于各种原因)或头文件.
我的C#代码如下所示:
public struct STATUSSTRUCT
{
public UInt64 nameLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4128)]
public byte[] name;
}
STATUSSTRUCT status;
[DllImport("test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int getStatus(ref STATUSSTRUCT status);
public void refreshStatus() {
status = new STATUSSTRUCT();
status.nameLen = 4128;
status.name = new byte[4128];
getStatus(ref status);
}
Run Code Online (Sandbox Code Playgroud)
但是,调用refreshStatus会给我System.AccessViolationException.
有人可以帮我弄清楚如何用C#在C++中调用这个函数吗?
您的结构需要一个指向数组的指针;你正在编组数组。交易的一侧期望获得地址“芝麻街 123 号”,并且您提供了该地址的公寓楼的精确复制品。那是行不通的。
为了获得正确的编组代码,您需要对 C# 中的内存管理有透彻而深入的了解。我的建议是您获得专家的服务。
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |