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
意味着任何传递的值都必须被调用的函数覆盖。