修复 "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);
我使用 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);