Gunakan kelas aplikasi terkelola C# di aplikasi C++ yang tidak terkelola

Saya memiliki proyek dengan kelas ini yang ditulis dalam C# yang saya gunakan untuk membuat serial beberapa data.

 [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; }

        //...
}

Saya juga punya proyek lain dalam solusi yang sama yang ditulis C++ MFC (tidak ada dukungan CLR) dengan kotak Dialog dengan 3 kotak teks.

Bagaimana saya bisa mengakses kelas "CPersoana" dari C++ sehingga saya bisa menggunakan "Nama", "Profesi" dan "Umur" dengan kotak teks saya?

Bantuan apa pun akan sangat dihargai!


person cosmotel    schedule 24.03.2014    source sumber
comment
Saya pikir menulis COM (Component Object Model) adalah salah satu pilihan. Tapi tidak mudah.   -  person Pranit Kothari    schedule 24.03.2014
comment
Saya mencoba tetapi belum berhasil.   -  person cosmotel    schedule 24.03.2014


Jawaban (2)


Pertama, proyek c# Anda harus berupa DLL (Jenis Output = Perpustakaan Kelas).

Kedua, Anda tidak dapat mengakses kode c# di C++ yang tidak dikelola, proyek C++ Anda memerlukan setidaknya satu file sumber yang dikompilasi dengan /CLR tempat Anda dapat mengakses kelas c# Anda.

Di file sumber itu, Anda dapat menulis kode seperti

#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

Menulis COM seharusnya tidak sulit:

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);
    }
    }

Implementasikan antarmuka

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

Kemudian menggunakannya di 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
Kode C++ Anda adalah Visual C++, jadi tetap memerlukan CLR. Itu berarti tidak ada gunanya melakukan COM - lihat jawaban yang diterima. - person ShdNx; 26.03.2014