【发布时间】: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。