我有一个包含本机DLL接口的模块;它看起来像这样:
// nvtt.dll binding module
module private NvTextureTools =
type NvttInputOptions = IntPtr
[<DllImport("nvtt", CallingConvention = CallingConvention.Cdecl)>]
extern NvttInputOptions nvttCreateInputOptions()
[<DllImport("nvtt", CallingConvention = CallingConvention.Cdecl)>]
extern void nvttDestroyInputOptions(NvttInputOptions)
[<DllImport("nvtt", CallingConvention = CallingConvention.Cdecl)>]
extern void nvttSetInputOptionsAlphaMode(NvttInputOptions, AlphaMode alphaMode)
[<DllImport("nvtt", CallingConvention = CallingConvention.Cdecl)>]
extern void nvttSetInputOptionsGamma(NvttInputOptions, float inputGamma, float outputGamma)
[<DllImport("nvtt", CallingConvention = CallingConvention.Cdecl)>]
extern void nvttSetInputOptionsWrapMode(NvttInputOptions, WrapMode mode)
(功能增加了5倍,但这应该是一般的想法)。
有没有办法只指定一次DllImport参数?据我所知,我不能继承DllImport(它是密封的,无论如何我不认为它会起作用,如果不是),我不能使用反射来添加必要的属性因为我需要它们编译时间。
我可以使用反射创建一个带P / Invoke方法的全新类,但这会使它们变得麻烦。
有什么想法吗?
答案 0 :(得分:0)
我不知道F#,但在C#中你可以做类似的事情:
static const string DllName = "nvtt";
[DllImport(DllName, other params...)]
some function signature
[DllImport(DllName, other params...)=
some function signature
这样实际的字符串只会被声明一次 - DllImport属性本身看起来仍然很相似,但它会让事情变得更容易。我认为你可以对CallingConvention做同样的事情,但我从来没有尝试过枚举。
答案 1 :(得分:0)
万一你使用Visual Studio - 可以创建一个T4模板并生成所有那些讨厌的属性。这不是F#或VS特定的解决方案,但是,任何代码生成工具都可以工作。