Sto scrivendo scrivendo un'API in COM in C++ e anche scrivendo un programma che utilizza questa API in C#. La mia domanda riguarda la semantica di gestione della memoria BSTR quando si passano i BSTR alle funzioni COM. Di 'la mia IDL assomiglia:Convenzione per il passaggio di BSTR in funzioni COM da C# (interoperabilità COM)
HRESULT SomeFunction([in] BSTR input);
Attualmente questa funzione è implementata in questo modo:
HRESULT SomeFunction(BSTR input) {
// Do stuff ..., then:
SysFreeString(input);
}
Quando chiamo da C# con qualcosa di simile SomeFunction(myString)
, sarà C# generare qualcosa come questo (pseudocodice):
myString = SysAllocString("string");
SomeFunction(myString);
O meglio così:
myString = SysAllocString("string");
SomeFunction(myString);
SysFreeString(myString);
Cioè, C# libera il BSTR che genera per eseguire il marshall all'interfaccia COM, o dovrei liberarlo all'interno della mia funzione? Grazie!
Questa risposta non ha nulla a che fare con ciò che il CLR fa automaticamente per l'interoperabilità, che è tutto ciò che l'OP sta chiedendo. – ildjarn
@ildjarn: al contrario, risponde esattamente alla domanda dell'OP. –
@Alf: indicare la risposta corretta per le ragioni sbagliate e con il contesto ei collegamenti errati non è "corretto". – ildjarn