C# C dll向C返回多个变量#

C# C dll向C返回多个变量#,c#,c,dll,return-type,C#,C,Dll,Return Type,我有一个用C编写的dll,可以导入到C应用程序中。我只需要从dll中读取一些硬件设备的值,实际的读取过程由C dll中的函数完成。 现在我想用这个函数读出所有的值,并以一种快速简单的方式将它们返回到C#。 它是一个非常“通用”的多平台C库,由一些函数组成,用于处理与所述硬件设备的通信。我在寻找一个“从C到C”的一般答案,而不是针对我的情况 我对C和C不太有经验,这使得任务相当复杂(我对语言没有选择)。 用C做这件事的聪明方法是什么?我如何用C声明它,如何用C正确导入它 下面是一些伪代码,让我的问

我有一个用C编写的dll,可以导入到C应用程序中。我只需要从dll中读取一些硬件设备的值,实际的读取过程由C dll中的函数完成。 现在我想用这个函数读出所有的值,并以一种快速简单的方式将它们返回到C#。 它是一个非常“通用”的多平台C库,由一些函数组成,用于处理与所述硬件设备的通信。我在寻找一个“从C到C”的一般答案,而不是针对我的情况

我对C和C不太有经验,这使得任务相当复杂(我对语言没有选择)。 用C做这件事的聪明方法是什么?我如何用C声明它,如何用C正确导入它

下面是一些伪代码,让我的问题更清楚一些。这不是有效的代码,但应该清楚我在找什么 C:

C#

我尝试返回一个int数组并在C#中封送它,因为我所有的值都是int类型的,但似乎在C中返回数组是不可能的


<>我发现了很多C++的例子,但是它们没有使用C,因为它们使用C++特定的函数。

你可以让你的C API把这些值设置成作为参数传递的指针,即:

void your_c_function(int* value1, int* value2)
{
    *value1 = 42;
    *value2 = 43;
}
然后,您可以通过
ref

[DllImport("your_dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int your_c_function(ref int value1, ref int value2);

请注意,如果有许多值需要设置,还可以在C中定义一个
结构
,并通过指针传递整个结构。但是,这需要在托管端重新创建结构定义。

您可以让C API将值设置为作为参数传递的指针,即:

void your_c_function(int* value1, int* value2)
{
    *value1 = 42;
    *value2 = 43;
}
然后,您可以通过
ref

[DllImport("your_dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int your_c_function(ref int value1, ref int value2);

请注意,如果有许多值需要设置,还可以在C中定义一个
结构
,并通过指针传递整个结构。但是,这需要在托管端重新创建结构定义。

您的问题太笼统了。我想你需要发布一些代码。C DLL中方法的签名将是一个良好的开端。声明一个结构并通过引用传递它。像int Foo(struct info*retval)一样,当前无法访问我的代码。我稍后会尝试添加它。虽然我想得到一个一般性的答案,因为我经常面对这个问题,并且总是回到对每个变量使用一个函数,这有点愚蠢。一个“C dll”可以承载不同类型的代码,在尝试从C#调用它之前,了解您拥有的类型是很重要的。DLL可以是COM(组件对象模型)DLL,也可以是一个简单的编译函数库。请参阅本文,以帮助您确定您正在使用的是什么-它是前者。我会补充这些信息。你的问题太笼统了。我想你需要发布一些代码。C DLL中方法的签名将是一个良好的开端。声明一个结构并通过引用传递它。像int Foo(struct info*retval)一样,当前无法访问我的代码。我稍后会尝试添加它。虽然我想得到一个一般性的答案,因为我经常面对这个问题,并且总是回到对每个变量使用一个函数,这有点愚蠢。一个“C dll”可以承载不同类型的代码,在尝试从C#调用它之前,了解您拥有的类型是很重要的。DLL可以是COM(组件对象模型)DLL,也可以是一个简单的编译函数库。请参阅本文,以帮助您确定您正在使用的是什么-它是前者。我将添加这些信息。谢谢,我不知道这是可能的。如果C函数是空的,调用函数后如何访问指针的值?我并不完全熟悉这个概念。不过,MSDN关于“ref”的文章对此解释得很好。谢谢你简单的回答。谢谢,我不知道这是可能的。如果C函数是空的,调用函数后如何访问指针的值?我并不完全熟悉这个概念。不过,MSDN关于“ref”的文章对此解释得很好。谢谢你简单的回答。