Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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#_C++ - Fatal编程技术网

C# 将参数从托管代码传递到非托管代码

C# 将参数从托管代码传递到非托管代码,c#,c++,C#,C++,我必须使用来自头文件中具有以下签名的库的方法: NKREMOTELIB_API int __stdcall GetEvfFrame( const unsigned char*& buffer, size_t& size, NKRemoteEvfDisplayInfo& displayInfo); 我通过以下方式从c#调用这些: [DllImport("NKRemoteLib.dll")] public static extern int GetE

我必须使用来自头文件中具有以下签名的库的方法:

NKREMOTELIB_API int __stdcall GetEvfFrame(
    const unsigned char*& buffer,
    size_t& size,
    NKRemoteEvfDisplayInfo& displayInfo);
我通过以下方式从c#调用这些:

[DllImport("NKRemoteLib.dll")]
public static extern int GetEvfFrame(out IntPtr buffer, out IntPtr size, out NKRemoteEvfDisplayInfo displayInfo);

private void Test() {
    IntPtr size = new IntPtr();
    IntPtr buffer = new IntPtr();
    NKRemoteEvfDisplayInfo displayInfo;
    int res = GetEvfFrame(out buffer, out size, out displayInfo);
}
我在c#中也将displayInfo定义为一个结构


我的问题是,头文件中的函数签名对符号和有何意义?为什么使用size\u t而不是size\u t或char*&而不是char*

符号(
&
)代表“参考”。这与c#
out
修饰符基本相同。

符号表示按引用传递语义。换句话说,
GetEvfFrame
函数被传递一个对
size\u t
值的引用,而不是
size\u t
值本身


您的p/invoke签名应该真正使用
ref
而不是
out
这与C++/C#interop无关。它实际上是关于C++的。 C++有引用的概念。通过引用传递对象时,实际上传递的是对象本身,而不仅仅是副本。这意味着对被调用者中对象的任何修改都将出现在调用者中。C#的概念与
out
ref
关键字类似

您可以通过以下方式进行测试:

void f(int i)
{
    i = 5; 
}
void g(int &i)
{
    i = 5;
}

int i = 0, j = 0;
f(i);
g(j);
std::cout << i; // should print 0
std::cout << j; // should print 5
void f(int i)
{
i=5;
}
空g(内部和内部)
{
i=5;
}
int i=0,j=0;
f(i);
g(j);

std::cout“为什么使用size\u t&而不是size\u t”,因为它是以这种方式实现的,没有明显的理由这样做。感谢Lukas,我实际上是在问关于符号的语义意义,当使用ref而不是out时会有什么区别?
ref
意味着可以向函数传递一个值,函数可以修改也可以不修改该值
out
意味着任何传递的值都必须被调用的函数覆盖。