Есть C# dll, предназначенная для вызовов из неуправляемого кода через COM (интерфейс и класс):
interface IFoo
{
string GetResult(string str);
}
public class Foo : IFoo
{
public string GetResult(string str)
{
string result = .... // создаем объект типа string и возвращаем его как результат
return result;
}
}
При импорте типов метод превращается в следующее:
virtual HRESULT FooNamespace::IFoo::GetResult(BSTR str, BSTR* pRetVal) = 0;
Соответственно, в С++ дергается так:
#import "Foo.tlb" named_guids raw_interfaces_only
....
FooNamespace::IFooPtr pFoo;
HRESULT hRes = pFoo.CreateInstance(FooNamespace::CLSID_Foo);
if (hRes == S_OK)
{
CComBSTR val = ....;
BSTR strResult = NULL;
pFoo->GetResult(val, &strResult);
CString result = strResult;
...
}
...
Все работает.
Вопрос в том, что происходит с памятью, выделяемой внутри C#-метода. Объект string создается и возвращается в С++, где "превращается" в BSTR. Происходит глубокое копирование, или этот BSTR есть тот же адрес, что и оригинальный string? Но ведь за очистку с одной стороны отвечает GC, с другой — на стороне С++ нужно явно вызвать какую-то очистку..
В общем вопрос, как правильно вернуть строку из C# в С++, чтобы не было никаких ликов и прочих граблей...
заранее спасибо за помощь.