c++方法:
extern "C" _declspec(dllexport) bool GetKE(string CaseId, string CaseText, string &CaseReason, SS *KeList,int &nLen_KeList);
c++结构体:
typedef struct BriefKE
{
string KeName;
string KeValue;
}SS;
C#结构体:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
public struct BriefKE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string KeName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string KeValue;
}
C#函数:
[DllImport("KnowledgeExtract.dll", EntryPoint = "GetKE")]
[return: MarshalAs(UnmanagedType.Bool)]
public unsafe static extern bool GetKE(StringBuilder CaseId, StringBuilder CaseText, ref StringBuilder CaseReason, BriefKE[] infos, ref int nLen_KeList);
C#调用:
//结构体数组指针初始化
SS[] KeList = new SS[20];
for (int i = 0; i < KeList.Length; i++)
{
KeList[i] = new SS();
}
IntPtr[] ptArray = new IntPtr[1];
ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS)) * 20);
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS)));
Marshal.Copy(ptArray, 0, pt, 1);
//其他几个参数初始化省略
if (!test.GetKE(caseId, caseText, ref caseReason, infos, ref len))
{
Console.WriteLine("读取失败");
Console.ReadLine();
}
总是报下面这个错,请大神给写一个C#调用的例子
“System.AccessViolationException”类型的未经处理的异常在 未知模块。 中发生
其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。