DLLimport einer nativen DLL / COM Objekt
-
Hallo zusammen
ich verwende folgenden Code zum ansprechen einer nativen DLL Datei:
[DllImport("C:\\meinedll.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Ansi)] public static extern UInt32 meineMethode([MarshalAs(UnmanagedType.LPStr)] string param1, [MarshalAs(UnmanagedType.LPStr)] string param2, [MarshalAs(UnmanagedType.LPStr)] string param3, [MarshalAs(UnmanagedType.LPStr, SizeConst = 32768)] StringBuilder param4); static void Main(string[] args) { StringBuilder res = new StringBuilder(32768); UInt32 test = meineMethode("param", "param", "param", res); Console.WriteLine(test.ToString()); string s = res.ToString(); Console.WriteLine(s); Console.ReadLine(); }
Abhängig von den Parametern reagiert der Funktionsaufruf bei der DLL unterschiedlich.
Wenn der Parameter so gewählt wird, dass kein COM Objekt (innerhalb der nativen DLL) erstellt wird, dann funktioniert der Aufruf und ich bekomme ein Ergebnis.
ABER: Wenn die DLL ein COM Objekt instantiert, dann funktioniert der Aufruf nicht.Leider bekomme ich keine Exception oder sonstiges. Vermute evtl. etwas mit den Security Einstellungen, aber ich weiß es eben nicht.
Woran könnte es liegen das bei dem Aufruf kein COM Objekt innerhalb der DLL erzeugt werden darf/kann?Vielen Dank für Tipps
Viel Grüße
-
Sicher das du keine Exception bekommst? Sind denn alle Exceptions eingeschaltet?
-
Hallo,
also ich habe zumindest keine Exceptions ausgeschaltet. Daher denke ich, dass ich alle bekomme.
Die Sache ist aber auch folgende:
Die Methode ist so programmiert das sie "1" zurück gibt, wenn der Methodenaufruf erfolgreich war und "0" wenn nicht.Bei den Methoden wo das COM Object erzeugt wird bekomme ich eine "0" (d.h. Problem/Fehler in der DLL). Daher denke ich das es daran liegt, dass die aufgerufende DLL das COM Objekt nicht instantieren darf.
Wenn möglich schalte ich aber gerne weitere Exceptions ein.
Achja, die DLL wird auch von anderen Anwendungen benutzt, daher gehe ich davon aus dass das Problem von Seiten meines .Net Programms kommt.
Danke nochmals
-
Hallo nochmal,
also es lag nun nicht nur an der C# Anwendung sondern auch an der DLL.
Zum einen musste bei der C# Anwendung [MTAThread] eingestellt sein.Dies kann dann mittels
Thread.CurrentThread.SetApartmentState(ApartmentState.MTA); if (Thread.CurrentThread.ApartmentState == ApartmentState.MTA) { MessageBox.Show("ok"); // OK, wenn State == MTA }
geprüft werden.
Und außerdem hat C# das Com Objekt in der DLL automatisch initialisiert.
Dadurch kam es zu einem Fehler wenn innerhalb der DLL das Objekt erneut initialisiert wurde.Vlt. hilft es ja dem ein oder anderen
Gruß
-
Ja, das Problem ist bekannt. Aber da fliegen dir im Normalfall enstprechende Exceptions um die Ohren.