ใช้คลาสแอปที่ได้รับการจัดการ 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 (Component Object Model) เป็นทางเลือกหนึ่ง แต่ไม่ใช่เรื่องง่าย   -  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