小编and*_*rei的帖子

在C#中编组来自dll的unsigned char*返回函数

我在本机DLL中有以下函数头:

unsigned char* Version_String()
Run Code Online (Sandbox Code Playgroud)

我试图从C#项目调用它,我尝试了以下调用(在此处的其他类似问题中找到):

[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
Run Code Online (Sandbox Code Playgroud)

我一直得到以下异常:

尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

下一个尝试是以下,我得到相同的例外:

[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
Run Code Online (Sandbox Code Playgroud)

我似乎无法解决这个问题.任何帮助将不胜感激!

编辑:

我不能在这里给出DLL代码,因为它属于NDA,但我调用的函数看起来像这样:

unsigned char versionString[50];

__declspec(dllexport) unsigned char* Version_String()
{
    if(check_hardware_stuff())
    {
      strcpy((char *) versionString, "version_string_bla_bla");
      versionString[5] = stuff;
    }
    else if (other_check())
    {
      //will return empty string, that should be filled with '\0'
    }
    else
    {
      strcpy( (char *) versionString, "ERROR" );
    }
  return versionString;
}
Run Code Online (Sandbox Code Playgroud)

我并不特别喜欢DLL实现,但我需要"按原样"使用它.无论我VersionString()对返回值做什么,每次尝试调用时都会抛出异常.

c# pinvoke return marshalling

5
推荐指数
1
解决办法
3794
查看次数

标签 统计

c# ×1

marshalling ×1

pinvoke ×1

return ×1