我有一个 C++ 函数,已导出到 DLL。 I 包含一个结构体指针作为参数之一。我需要在 C# 中使用此函数,因此我使用 DLLImport 作为该函数,并使用 StructLayout 在 C# 中重新创建了该结构。我尝试使用 ref 传入参数,并尝试使用 MarshalAs(UnmangedType.Struct) 和 Marshal.PtrToStructure 对其进行封送。参数仍然没有正确传递。
Example:
[DllImport("testdll.dll")]
public static extern int getProduct(int num1, int num2, [MarshalAs(UnmanagedType.Struct)] ref test_packet tester);
还有一点信息,该结构包含一个 byte* var,我认为这可能会导致将参数作为引用传递时出现问题。有任何想法吗?我走在正确的轨道上吗?谢谢您的帮助。
感谢 nobugz 的回复。这是结构体 def 的示例:
//C# DEFINITION
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct test_packet
{
public UInt32 var_alloc_size;
public byte* var;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_TAG_LENGTH)]
public byte[] tag;
}
//ORIGINAL UNMANAGED STRUCT
typedef struct test_packet_tag
{
unsigned int var_alloc_size;
unsigned char *var;
unsigned char tag[MAX_TAG_LENGTH];
} test_packet;
使用“ref”是正确的方法,摆脱 [MarshalAs] 属性。真正的问题几乎肯定是结构声明。您没有发布任何可以帮助我们帮助您的内容。
DllImportAttribute.CharSet 属性错误,请将其设为 CharSet.Ansi。 “var”成员声明错误,将其设为byte[]。请务必在调用之前对其进行初始化:
var product = new test_packet();
product.var_alloc_size = 666; // Adjust as needed
product.var = new byte[product.var_alloc_size];
int retval = getProduct(42, 43, ref product);
最好的猜测,希望它有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)