重构许多相同的DllImport声明

时间:2011-01-24 06:34:47

标签: f# pinvoke dllimport

我有一个包含本机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方法的全新类,但这会使它们变得麻烦。

有什么想法吗?

2 个答案:

答案 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特定的解决方案,但是,任何代码生成工具都可以工作。