Как вернуть объекты коллекции из c # и получить к ним доступ в c ++? - PullRequest
0 голосов
/ 28 июня 2009

Я попытался вернуть коллекцию объектов из c # и получить доступ к ним через c ++ через COM, но потерпел неудачу. Я попытался использовать List ArrayList и IDictionary all и потерпел неудачу.

Я пытался

Как вернуть коллекцию строк из C # в C ++ через COM-взаимодействие , но не удалось.

может ли тело помочь мне

Ответы [ 3 ]

2 голосов
/ 05 июля 2009

@ Частично, вы подняли важный вопрос. Вы не можете передать «объект» .NET обратно в C ++ (если это не Managed C ++), потому что семантика объекта .NET отличается от семантики объекта C ++.

@ Cute: однако вы можете передавать указатели интерфейса COM. Если вам нужен ваш «традиционный C ++» код для общения с объектами .NET, используйте COM-интерфейсы, а не объекты.

Убедитесь, что ваш объект помечен как объект COM, и что вы реализуете подходящий интерфейс, который содержит методы, необходимые вашему C ++. Затем передайте массив ссылок интерфейса обратно в код C ++. Код C ++ должен получить указатель SafeArray COM-интерфейса, которым он может манипулировать с обычной семантикой COM (AddRef () и т. Д.).

0 голосов
/ 04 июля 2009

Это нормально, что вы не можете передать объект из c # в c ++ или из c ++ в c #. Объект в c # не похож на объект в c ++. То, что вы можете передать с c # на c ++, это такие типы, как bool, int и char. Также обратите внимание на размер типов ... например, char в c # - это wchar_t в c ++.

0 голосов
/ 28 июня 2009

Как насчет использования старомодного массива?

public interface IManaged
{
    string[] ReturnArray();
}

public class Managed : IManaged
{
    public string[] ReturnArray()
    {
        return new string[] { "A", "B", "C" };
    }
}

Запуск tlbexp.exe с этим .dll создает .tlb с:

interface IManaged : IDispatch {
    [id(0x60020000)]
    HRESULT ReturnArray([out, retval] SAFEARRAY(BSTR)* pRetVal);
};

Я не тестировал использование .dll из нативного .exe, но выглядит многообещающе:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...