Использование класса управляемого приложения C # в неуправляемом приложении C ++

У меня есть проект с этим классом, написанный на C #, который я использую для сериализации некоторых данных.

 [XmlType("CPersoane")]
 public class CPersoana
 {
        public CPersoana() { }

        [XmlElement("name")]
        public string Name { get; set; }

        [XmlElement("profession")]
        public string Profession{ get; set; }

        [XmlAttribute("age")]
        public int Age{ get; set; }

        //...
}

У меня также есть другой проект в том же решении, написанный на C ++ MFC (без поддержки CLR) с диалоговым окном с 3 текстовыми полями.

Как мне получить доступ к классу CPersoana из C ++, чтобы я мог использовать «Имя», «Профессию» и «Возраст» в своих текстовых полях?

Любая помощь будет принята с благодарностью!


person cosmotel    schedule 24.03.2014    source источник
comment
Я думаю, что написание COM (компонентной объектной модели) - это один из вариантов. Но непросто.   -  person Pranit Kothari    schedule 24.03.2014
comment
Я пробовал, но безуспешно.   -  person cosmotel    schedule 24.03.2014


Ответы (2)


Во-первых, ваш проект C # должен быть DLL (Тип вывода = Библиотека классов).

Во-вторых, вы не можете получить доступ к коду C # в неуправляемом C ++, вашему проекту C ++ нужен хотя бы один исходный файл, скомпилированный с /CLR, из которого вы можете получить доступ к своему классу C #.

В этом исходном файле вы можете написать такой код, как

#using "MyCSharpProject.DLL"
using namespace MyCSharpNamespace;
...
gcroot<CPersoana^> pPersona = gcnew CPersoana();
CString sFileName = <path to file>;
pPersona->LoadFromFile(gcnew System::String(sFileName));
// LoadFromFile would be a member function in the CPersoana class
// like bool LoadFromFile(string sFileName)
CString sName(pPersona->Name->ToString();
...
person Edward Clements    schedule 24.03.2014

Написание COM не должно быть трудным:

namespace CPersoanaNameSpace
{
   [Guid("8578CEB3-6C04-4FC2-BB80-FB371A9F")]
   [ComVisible(true)]
   public interface ICPersoanaCOM
   {

      [DispId(1)]
      void Name(out string name);

      [DispId(2)]
      void Profession(out string profession);

      [DispId(3)]
      void Age(out int age);
    }
    }

Реализуйте интерфейс

   [ComVisible(true)]
   [Guid("6BE742E0-CDEC-493A-B755-D5Crtr5w6A545"),
   public class CPersoana: ICPersoanaCOM
   {
//...
   }

Затем используя его в C ++:

//Import tlb
#import "path to tlb\Persoana.tlb"  named_guids raw_interfaces_only
using namespace System;

int main(array<System::String ^> ^args)
{

   CoInitialize(NULL);   //Initialize all COM Components


   CPersoanaNameSpace::CPersoanaCOMPtr objPtr;

  HRESULT hRes =  objPtr.CreateInstance(CPersoanaNameSpace::CLSID_CPersoana);
  if (hRes == S_OK)
  {
      BSTR LocName;
      objPtr->Name(&LocName);
      }

}
person user3189858    schedule 24.03.2014
comment
Ваш код C ++ - это Visual C ++, поэтому ему в любом случае нужна среда CLR. Значит, делать COM нет смысла - см. Принятый ответ. - person ShdNx; 26.03.2014