Как использовать DllImport с интерфейсами в C #? - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть несколько DllImport в отношении user32.dll в моем коде, и я думал, что они объявлены в интерфейсе. Но это дает мне ошибки, говоря, что public, static, extern недопустимы для каждого элемента.

Пример кода интерфейса выглядит следующим образом:

public interface IWindowsFunctions
{
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   static extern int MessageBox(int hWnd, string msg, string title, uint flags);
}

Есть ли какой-то конкретный способ использования этого в интерфейсе, или есть альтернатива, или это невозможно с интерфейсом?

Спасибо

Ответы [ 4 ]

10 голосов
/ 05 апреля 2011

Ну, уже много раз упоминалось, что DLLImport является реализацией, и поэтому его нельзя определить в интерфейсе, но я подумал, что все же стоит упомянуть, что обычно я группирую по DLLImports в класс "NativeMethods" для организацииПримерно так:

internal static class NativeMethods
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int MessageBox(int hWnd, string msg, string title, uint flags);
}

Пример использования:

NativeMethods.MessageBox(myWnd, "Hello World", "Hello", flags);
4 голосов
/ 05 апреля 2011

Уже реализовано - реализация находится в user32.dll. Вот что означает ключевое слово extern:

Модификатор extern используется для объявления метода, который реализован извне.

Интерфейсы могут объявлять методы экземпляра только для своих разработчиков; поэтому ключевое слово static здесь также недопустимо.

Наконец, интерфейс не может объявлять реализации; могут только его разработчики. В этом случае, поскольку реализация уже существует, нет смысла создавать интерфейс для нее.

Если вы хотите создать класс-оболочку для неуправляемых вызовов, см. Ответ Крагена .

1 голос
/ 05 апреля 2011

Вы не можете этого сделать.DllImport составляет около реализации , а интерфейс ничего не говорит о реализации.Кроме того, в C # отсутствует концепция статического взаимодействия.

Вы можете создать интерфейс с правильной сигнатурой и создать класс, реализующий этот интерфейс, если хотите.

1 голос
/ 05 апреля 2011

Методы интерфейса не могут иметь модификаторы доступности, то есть вы не можете применять к ним статические / extern / public / private / etc декораторы.

Я не понимаю, почему вы хотите использовать интерфейсза это;это нестандартный метод и условно DllImport - это реализация, которая не принадлежит интерфейсу.

Вместо этого вы можете использовать статический класс или даже структуру.

...