繁体   English   中英

F#Pinvoke错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM