Die Parametrierung DllImport für die Verwendung in einer C# - Anwendung

Wir haben einen Anbieter, der bietet eine Bibliothek für den Zugriff auf Ihre hardware. Leider, wenn Sie mehrere Geräte besitzen, müssen Sie es importieren, Ihre Bibliothek mehrere Male, mit verschiedenen dll-Namen. Als Konsequenz haben wir eine Tonne von duplizierten code, und ich bin besorgt, dass es bald ein Wartungs-Albtraum.

Was wir im moment haben, ist so etwas wie:

namespace MyNamespace {
    public static class Device01 {
        public const string DLL_NAME = @"Device01.dll";

        [DllImport(DLL_NAME, EntryPoint = "_function1")]
        public static extern int Function1(byte[] param);

...

        [DllImport(DLL_NAME, EntryPoint = "_function99")]
        public static extern int Function99(int param);
    }

....

    public static class Device16 {
        public const string DLL_NAME = @"Device16.dll";

        [DllImport(DLL_NAME, EntryPoint = "_function1")]
        public static extern int Function1(byte[] param);

...

        [DllImport(DLL_NAME, EntryPoint = "_function99")]
        public static extern int Function99(int param);
    }
}

Wenn ich mit C oder C++, würde ich einfach definieren die Funktionen einer Datei #include Sie mehrmals in den statischen Klassen, nicht schön aber besser als die alternative, aber in C# habe ich nicht, die option.

Wenn jemand irgendwelche kluge Ideen über, wie man effektiv definieren eine Fabrik, die es uns erlauben würde, um so viele statische device-Klassen, wie wir brauchen, wäre ich sehr daran interessiert.

Dank,

Edit: Die Funktionsprototypen sind ganz videly abwechslungsreich, so dass jede Methode, die auf Ihnen beruht, der gleiche wäre nicht geeignet. Vielen Dank für die Anregungen bisher, ich war nicht expacting so viele Ideen, ganz so schnell.

  • Zu deinem letzten edit: meine "Dritte Ansatz" kann angepasst werden, um alles, was Sie mögen. Erstellen Sie einen Delegaten-Typ für jede Methode (müssen Sie sowieso, und Sie haben, dass derzeit bereits als DllImports), fügen Sie ein param-array für Parameter und Generika verwendet, um die Aufrufe von typesafe. Halten Sie auf, ich werde versuchen, passen Sie die Beispiel.
  • Mit dem Zusatz "Delegierte Reflexion" (tx Eric Lippert) und Generika, es behebt Ihr Problem, für fast jede Art von P/Invoke-Aufrufe, die Sie antreffen können 😉
InformationsquelleAutor Mark Booth | 2009-11-02
Schreibe einen Kommentar