如何将结构编组为指向结构的指针?

时间:2009-05-06 01:40:44

标签: c# pinvoke

我正在尝试将C#中的结构传递给C ++库。我将结构作为对象传递,C ++函数将它作为指针(void *)。

我在传递结构方面遇到了问题。

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);

这是我得到的运行时异常文本:

  

“无法封送'参数#1':无效的托管/非托管类型组合(此值类型必须与Struct配对)。”

虽然我发现了一篇在这种情况下使用LPStruct的MSDN文章。

这是我试图编组的结构:

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int userParam1;
}

这是C ++函数:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...

3 个答案:

答案 0 :(得分:17)

尝试将结构作为ref参数传递。

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);

当您使用结合结构的引用时,它在概念上传递地址。

答案 1 :(得分:13)

顺便说一句,UnmanagedType.LPStruct很少(如果有的话)是正确的MarshalAs参数。 A quote from Adam Nathan谁是Microsoft员工:

  

UnmanagedType.LPStruct仅支持一种特定情况:将System.Guid值类型视为具有额外间接级别的非托管GUID。

答案 2 :(得分:0)

有关@Rytmis帖子的一些其他信息跟踪。

来自https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/interop-pinvokes.md


  

向导可以直接在签名中使用。当通过ref传递时,它们既可以通过add_action( 'wpcf7_before_send_mail', 'wpcf7_add_text_to_mail_body' ); function wpcf7_add_text_to_mail_body( $contact_form ) { //Get the form ID $form_id = $contact_form->id(); //Do something specifically for form with the ID "123" if( $form_id == 123 ) { $submission = WPCF7_Submission::get_instance(); $posted_data = $submission->get_posted_data(); $values_list = $posted_data['valsitems']; $values_str = implode(", ", $values_list); // get mail property $mail = $contact_form->prop( 'mail' ); // returns array // add content to email body $mail['body'] .= 'INDUSTRIES SELECTED'; $mail['body'] .= $values_list; // set mail property with changed value(s) $contact_form->set_properties( array( 'mail' => $mail ) ); } } 传递,也可以通过ref属性传递。

     

[MarshalAs(UnmanagedType.LPStruct)]应该仅用于。