【问题标题】:F# consuming unmanaged dll functionsF# 使用非托管 dll 函数
【发布时间】:2014-01-23 17:18:55
【问题描述】:

我有一个用 F# 编写的项目,我必须为其中的一部分使用非托管 DLL。我对 .Net 编程非常陌生,因此这是在其他一切之上添加的另一个复杂级别。

在非托管 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# 中做到这一点。只创建一个 C# 类,将包装外部 DLL 函数的所有函数定义放入其中,然后从 F# 调用这些函数,而不是直接从 F# 调用非托管函数,这不是一个好主意吗?

其他人会怎么做呢?提前致谢!

【问题讨论】:

  • 在 F# 中更容易,因为 extern 声明基本上使用 C 语法。见文章External Functions on MSDN
  • 谢谢,我看到了那个例子,但它是一个非常简单的例子。特别是,我将如何处理输入和输出变量的所有编组?你能告诉我上面的例子在 F# 中的样子吗? (再次重申,我还是个 .Net 新手)
  • 您通常可以从直接从 C 复制函数声明开始。Here are some more examples

标签: c# .net dll f# dllimport


【解决方案1】:

在 MSDN 或规范中似乎没有对 extern 函数声明语法的描述。但是,据我所知,它逐字反映了 C 声明,正如您在 these (rather old) examples 中看到的那样。

我在 MSDN 页面上为 External Functions 留下了反馈,建议其中包含语法解释和示例。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2010-10-14
    • 2017-10-16
    相关资源
    最近更新 更多