Рефакторинг многих идентичных объявлений DllImport - PullRequest
1 голос
/ 24 января 2011

У меня есть модуль, который содержит интерфейс к собственной 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 голосов
/ 01 июля 2011

На всякий случай, если вы используете Visual Studio - возможно создать шаблон T4 и сгенерировать все эти неприятные атрибуты.Однако это не специфичное для F # или VS решение, подойдет любой инструмент для генерации кода.

0 голосов
/ 24 января 2011

Я не знаю о F #, но в C # вы можете сделать что-то вроде:

static const string DllName = "nvtt";

[DllImport(DllName, other params...)]
some function signature

[DllImport(DllName, other params...)=
some function signature

Таким образом, фактическая строка объявляется только один раз - сами атрибуты DllImport все еще выглядят одинаково, но это облегчает изменение вещей. Я думаю, что вы могли бы сделать то же самое с CallingConvention, но я никогда не пробовал это с перечислением.

...