[英]F# delegate using pinvoke with C function callback on Linux / ARM
[英]F# Pinvoke error
我几天前发布了这个,但我得到的答案似乎没有用,所以我再次发布一些更详细的信息。
我有一个用F#编写的项目,我必须使用非托管DLL作为其中的一部分。 在非托管DLL的文档中,他们提供了如何从C#调用函数的示例,如下所示:
using System;
using System.Runtime.InteropServices;
[DllImport("foo.dll")] public static extern Int32 foo_init(
[MarshalAs(UnmanagedType.AnsiBStr), In()] ref string FOOarg_Handle,
[MarshalAs(UnmanagedType.AnsiBStr), In()] ref string FOOarg_User,
[MarshalAs(UnmanagedType.AnsiBStr), Out()] out string FOOarg_DataOut,
[MarshalAs(UnmanagedType.AnsiBStr), Out()] out string FOOarg_ErrOut);
我试图将其转换为F#,并尝试以下方法:
open System
open System.Runtime.InteropServices
[<DllImport(@"foo.dll", EntryPoint="foo_init")>]
extern int fooInit([<MarshalAs(UnmanagedType.AnsiBStr)>]string handle,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string user,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string result,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string error)
然后,我试图调用该函数:
let res = fooInit("", "", "", "")
不幸的是,这不起作用。 它编译但是当我运行它时,我最终得到一个Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
错误。
有没有人知道如何解决这个问题? 提前致谢!
实际上,这似乎有效:
open System
open System.Runtime.InteropServices
[<DllImport(@"foo.dll", EntryPoint="foo_init")>]
extern int fooInit([<MarshalAs(UnmanagedType.AnsiBStr)>]string& handle,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string& user,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string& result,
[<MarshalAs(UnmanagedType.AnsiBStr)>]string& error)
然后我必须以这种方式调用函数:
let mutable h, u, r, e = "", "", "", ""
let res = fooInit(&h, &u, &r, &e)
这篇文章帮助我搞清楚: http : //pblasucci.wordpress.com/2012/07/23/managing-pointers-or-fs-platform-invoke-gotcha/
您需要复制[In]
和[Out]
值以及MarshalAs
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.