我是一名有用的助手,可以为您翻译文本。
我有一个C++ dll,其中包含一个函数,我正在尝试从C#应用程序中调用该函数。
以下是C++头文件中的代码。
所以当我到达代码的最后一部分时,我会收到“尝试读取或写入受保护的内存。这通常是其他内存损坏的指示。”错误。
我之前没有导入DLL的经验,并且我已经做了很多搜索,但似乎找不到解决问题的方法。
我尝试从头开始使用返回整数的简单函数,它起作用了。然后我添加了一个整数让我传递给函数,它仍然有效。然后我添加了一个字节数组让我传递,这也起作用了。然后我尝试将该字节数组转换为引用,但失败了。所以我的猜测是我没有正确地获取数据。
非常感谢任何帮助。
我有一个C++ dll,其中包含一个函数,我正在尝试从C#应用程序中调用该函数。
以下是C++头文件中的代码。
extern "C" _declspec(dllexport) int LabelStoringSSDsim(int devNum, UCHAR serial[40], UCHAR wwn[40],
UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode);
这是C++源文件中的代码
int LabelStoringSSDsim(int devNum, UCHAR serialLbl[40], UCHAR wwnLbl[40],
UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode)
{
string strConfigID="12111"; //5 bytes
string strFrmRev="1.25...."; //8 bytes
string strDevName="ABC-123................................."; //40 bytes
for (int i=0;i<5;i++)
ConfigID[i] = strConfigID[i];
for (int i=0;i<8;i++)
FrmRev[i] = strFrmRev[i];
for (int i=0;i<40;i++)
DevName[i] = strDevName[i];
return eCode;
}
这是与C#相关的代码
[DllImport("LabelStoring.dll")]
static extern int LabelStoringSSDsim(
int devNum,
byte[] strserial,
byte[] strwwn,
[In] ref byte[] ConfigID,
[In] ref byte[] FrmRev,
[In] ref byte[] DevName,
int eCode
);
int errNum = LabelStoringSSDsim(devNum, bserial, bwwn, ref ConfigID, ref FrmRev, ref DevName, 123123);
所以当我到达代码的最后一部分时,我会收到“尝试读取或写入受保护的内存。这通常是其他内存损坏的指示。”错误。
我之前没有导入DLL的经验,并且我已经做了很多搜索,但似乎找不到解决问题的方法。
我尝试从头开始使用返回整数的简单函数,它起作用了。然后我添加了一个整数让我传递给函数,它仍然有效。然后我添加了一个字节数组让我传递,这也起作用了。然后我尝试将该字节数组转换为引用,但失败了。所以我的猜测是我没有正确地获取数据。
非常感谢任何帮助。
ref
和[In, Out]
会导致崩溃吗?这是否类似于在C/C++中需要一个*
而实际上使用了**
的情况? - Sam Skuce