Ich bin dabei, GeckoFx (http://geckofx.org) zu erweitern und habe einige Probleme beim Zurückgeben von Array-Werten von nicht verwalteten Schnittstellen, die von XPCom bereitgestellt werden.Wie gibt man die Werte der unmanaged Interface Methode richtig zurück?
Ich habe eine große Menge neuer Feature-Unterstützung für GeckoFx mit dem neuesten XulRunner 1.9.2.13 Build hinzugefügt, aber ich erhalte Zugriffsverletzungsausnahmen, wenn ich versuche, Arrays von Interface-Methoden zurückzugeben. ZB:
[Guid("43987F7B-0FAA-4019-811E-42BECAC73FC5"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface mozISpellCheckingEngine
{
//...
void GetDictionaryList([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)]ref string[] dictionaries, out uint count);
//...
}
public static string[] GetAvailableDictionaries()
{
string[] _dictionaries = null;
uint count = 0;
//GetSpellChecker() returns a valid mozISpellCheckingEngine object
GetSpellChecker().GetDictionaryList(ref _dictionaries, out count);
if (count > 0)
{
if (_dictionaries != null)
{
return _dictionaries;
}
}
return null;
}
Das Problem ist, wenn GetDictionaryList kehrt manchmal wird es eine Liste mit einem einzigen Index zurückzukehren und den Namen eines Wörterbuch enthält (Ich habe 2 Wörterbücher in der Lage diese Methode sucht in) und zählen kehrt mit der korrekte Wert von 2; zu anderen Zeiten die Methode wird fehlschlagen und eine Zugriffsverletzung werfen und der Wert von _dictionaries ist string [0], während die Zählung mit dem Wert von 2 korrekt bleibt.
Ich denke, der größte Teil dieser Frage wäre "Bin ich" die Methode und ihre Parameter in der Interface-Deklaration richtig marshallen?
Dieser Beispielcode ist nur das - ein Beispiel. Es gibt einige andere XulRunner-Funktionen, die ich gerne in GeckoFx implementieren würde, aber sie geben auch Arrays zurück und leiden unter dem gleichen Problem. Bis ich über dieses Thema hinaus komme, steht meine Arbeit still.
Danke für jede Hilfe, die Sie zur Verfügung stellen können.
-Scott
Versuchen Sie, das Schlüsselwort 'ref' aus dem Array-Argument zu löschen, da dies Zeiger auf Zeiger auf Daten bedeutet (Arrays sind implizit Zeiger in C#), und meine Vermutung ist, dass die Schnittstelle Zeiger auf Daten angibt ist üblich für C-Arrays). – cdhowie
Hattest du Zugriff auf den Unmanage-Code, um ihn zu bearbeiten? –