Собственный экземпляр C ++ в управляемом коде с использованием оболочки C ++ - PullRequest
3 голосов
/ 24 ноября 2010

Мы сталкиваемся с проблемой взаимодействия, мы пишем exe-клиент на C #, у нас есть некоторый устаревший код, написанный на COM dll, и одна нативная статическая библиотека C ++.Нам потребовалось использовать оба из них для завершения функциональности в клиенте C #. Мы добавили ссылку на COM dll с помощью взаимодействия и смогли создать экземпляр класса COM внутри кода C #.Теперь этот метод класса COM принимает аргументы, которые являются объектами nactive C ++. Некоторым методам в классе COM нужны аргументы, которые являются объектами классов, объявленных в статической библиотеке c ++.Поскольку мы не сможем создать экземпляр собственных классов C ++ в C #, мы решили написать оболочку C ++ / CLI для собственного класса, создать экземпляр warpper в коде C #, получить доступ к экземпляру собственного класса через warpper и передать его в класс COM, созданныйКлиент C #Проблема в том, что когда мы передаем собственный указатель объекта (как IntPtr) в COM-класс, мы не получаем собственный объект, инициализированный его значениями.В чем может быть проблема?Как мы возвращаем нативный объект через управляемую оболочку c ++ в код C #?

 //Natvie C++ class
 class __declspec(dllexport) CConfiguration
 {

    public :
         CConfiguration(void);
         virtual ~CConfiguration(void);
         void SetIPAddress(const char *IPAddress);
         void SetPort(const char*Port);
         void GetIPAddress(char *IPAddress);
         void GetPort(char *Port);
    Private:
         std::string IPAddress;
         std::string Port;

 }


//Managed C++ Class  
public ref class ManagedConfigruation
{
         public :
        ManagedConfigruation(){}
        ~ManagedConfigruation(){}
         CConfiguration  *myConfiguration;          
              IntPtr  GetObjectOfConfigurationPtr();     
}

IntPtr ManagedConfigruation::GetObjectOfConfigurationPtr()
{
     myConfiguration = new CConfiguration();
     myConfiguration.SetIPAddress("127.0.0.1");
     myConfiguration.SetPort("6200");
     //Convert native object to IntPtr and return to C# class
     return System::IntPtr(myConfiguration);
};

 //C# class on client exe
 public class CSharpClass
{

    //Wrapper of Managed C++ class
    ManagedConfiguration objManagedConfiguration = new ManagedConfiguration();
    IntPtr objPtr = objManagedConfiguration.GetObjectOfConfigurationPtr();

    //Belwoo COMObject needs object of type CConfiguration native C++ class    
    COMObject.Initialize(objPtr);  //Here is the problem object does not contain anything


}

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

COM-метод, который принимает необработанный указатель, не совместим с Automation.Это довольно необычно, COM-методы используют указатели COM-интерфейса в этом сценарии.Вам лучше проверить в Object Browser, как он выглядит после преобразования библиотеки типов.У вас есть проблема, когда тип аргумента object .

Возможно, вам лучше сохранить код интерфейса COM в C ++ / CLI.

0 голосов
/ 25 ноября 2010

Initialize - это не метод COM, это наш собственный метод, который принимает в качестве аргумента IntPtr, который на самом деле является собственным объектом C ++.

0 голосов
/ 24 ноября 2010

Я никогда не использовал COMObject.Initialize (x), не уверен, что он делает.

Однако, если вы хотите получить IUnknown из вашего IntPtr, вы можете сделать это:

object pUnk = Marshal.GetObjectForIUnknown(objPtr);

см. Также: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getobjectforiunknown.aspx

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