Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将参数从C传递到嵌入式Mono_C#_Mono_Mono Embedding - Fatal编程技术网

C# 将参数从C传递到嵌入式Mono

C# 将参数从C传递到嵌入式Mono,c#,mono,mono-embedding,C#,Mono,Mono Embedding,我正试图使用嵌入式mono(如上所述)从C调用一个简单的C#class方法。我可以调用该方法,但C#函数接收0作为参数,而不是我传入的数字。C#函数返回一个结果,C代码看到了正确的结果——我就是不能传递参数。我做错了什么 C#组件(MonoSide.cs)是: 下面是C代码: #include <stdio.h> #include <stdlib.h> #include <mono/jit/jit.h> #include <mono/metadata/a

我正试图使用嵌入式mono(如上所述)从C调用一个简单的C#class方法。我可以调用该方法,但C#函数接收0作为参数,而不是我传入的数字。C#函数返回一个结果,C代码看到了正确的结果——我就是不能传递参数。我做错了什么

C#组件(MonoSide.cs)是:

下面是C代码:

#include <stdio.h>
#include <stdlib.h>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>

int main(int argc, char **argv)
{
    long long entryNumber = (argc > 1) ? atoi(argv[1]) : 10;

    // For brevity, null checks after each mono call are omitted.
    MonoDomain *domain = mono_jit_init("MainEntryPoint");
    MonoAssembly *monoAssembly = mono_domain_assembly_open(domain, "MonoSide.exe");
    char *monoArgs[] = {"Mono"};
    mono_jit_exec (domain, monoAssembly, 1, monoArgs);

    MonoImage * monoImage = mono_assembly_get_image (monoAssembly);
    MonoClass * monoClass = mono_class_from_name (monoImage, "Fibonacci", "Fibonacci");

    MonoMethod *monoMethod = mono_class_get_method_from_name(monoClass, "FibonacciNumber", 1);

    // Invoking method via thunk.
    typedef long long (*FibonacciNumber) (long long *);
    FibonacciNumber fibonacciNumber = mono_method_get_unmanaged_thunk (monoMethod);

    printf("Calling C# thunk function FibonacciNumber(%I64u)...\n", entryNumber);
    long long number = fibonacciNumber(&entryNumber);

    printf("Fibonacci number %I64u = %I64u\n", entryNumber, number);

    mono_jit_cleanup (domain);

    return 0;
}
输出为:

Calling C# thunk function FibonacciNumber(10)...
(inside C#) FibonacciNumber(0) = 0.
Fibonacci number 10 = 0
(为什么要使用这些功能?这只是一个示例,我可以开始工作,而不是我的最终目标。)

编辑:


如果我在C代码中将函数参数作为指针传递,它就会工作。C#正确地接收到它。上述代码已修改为:

typedef long long (*FibonacciNumber) (long long);
...
long long number = fibonacciNumber(entryNumber);
typedef long long (*FibonacciNumber) (long long);
...
long long number = fibonacciNumber(entryNumber);
致:


对我来说,这意味着在C和C之间传递任何更复杂的信息的最安全的方法是通过缓冲区,在C和C中使用匹配的序列化器和反序列化器。

如果我在C代码中以指针形式传递函数参数,它就会起作用。C#正确地接收到它。上述代码已修改为:

typedef long long (*FibonacciNumber) (long long);
...
long long number = fibonacciNumber(entryNumber);
typedef long long (*FibonacciNumber) (long long);
...
long long number = fibonacciNumber(entryNumber);
致:

对我来说,这意味着在C和C之间传递任何更复杂信息的最安全的方法是通过缓冲区,在C和C中使用匹配的序列化器和反序列化器

typedef long long (*FibonacciNumber) (long long);
...
long long number = fibonacciNumber(entryNumber);
typedef long long (*FibonacciNumber) (long long *);
...
long long number = fibonacciNumber(&entryNumber);