修复 "Cannot marshal 'return value'" 异常

Fixing "Cannot marshal 'return value'" exception

我使用 C# 从用 C 编写的 .so 库中调用一个方法。这是使用的 C# 代码:

    [DllImport("liblab.so")]
    
    static extern char[] entrance(
        [MarshalAs(UnmanagedType.LPWStr)]string path, 
        [MarshalAs(UnmanagedType.LPWStr)]string command);

    static void Main(string[] args)
    {
            command = Console.ReadLine();
            output = entrance(path, command).ToString();
            Console.WriteLine(output);
 }

(路径是那里的硬编码字符串)。

这就是在 C:

中调用的代码
char* entrance(char* path, char* command1){
struct state* fs_state = setup(path);
if (fs_state != NULL){
    fgets_wrapper(command1, LINE_MAX, stdin);
    struct commands command = parse_command(command1);
    return execute_operation(command, fs_state);
}
else return "No data";
}

从 C# 函数 entrance 调用导致 Unhandled exception. System.Runtime.InteropServices.MarshalDirectiveException: Cannot marshal 'return value': Invalid managed/unmanaged type combination. 错误。我尝试了不同的编码,但都没有用。

我该如何解决?

C 代码中的字符串似乎是 ANSI。

所以 C# 导入声明应该是

[DllImport("liblab.so")]
[return: MarshalAs(UnmanagedType.LPStr)]
static extern string entrance(
    [MarshalAs(UnmanagedType.LPStr)] string path,
    [MarshalAs(UnmanagedType.LPStr)] string command);