我正在创建要在c#应用程序中使用的c包装器库。在我的.c文件中,该函数定义为:
__declspec(dllexport) uint8_t aes132h_nonce(struct aes132h_nonce_in_out *param)
{
// do something
return 0;
}
在C#中,如何定义函数,该函数需要一个指向结构的指针并返回uint8_t
?
[DllImport("AesHelperLib.dll")]
public static extern uint8_t aes132h_nonce(ref aes132h_nonce_in_out *param);
我是否需要在c#中使用适当的填充和对齐方式来创建结构,还是可以导出结构aes132h_nonce_in_out
以便我可以在c#中使用该结构?另外,如何将返回类型定义为uint8_t
在c#中不是有效类型?
答案 0 :(得分:2)
我是否需要在c#中使用适当的填充和对齐方式来创建结构
从本质上讲,是的:无法直接在C#中使用C结构声明,也没有1:1映射。请注意,如果您在DLL导入中将参数声明为ref
,则也不要使其成为指针。
在某些情况下,例如当仅在API调用之间“传递”值时,您也可以将参数声明为IntPtr
(在这种情况下,按值传递)并将其内容视为不透明类型。
另外,如何在C#中将返回类型定义为
uint8_t
不是有效类型?
interop best practices说要使用最接近的等式.NET类型-在这种情况下为byte
。