在c++非托管应用中使用c#托管应用类

本文关键字:应用 c++ | 更新日期: 2023-09-27 17:52:13

我有一个用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个文本框的对话框。

我如何从c++中访问"cpersonana"类,以便我可以在文本框中使用"Name","Profession"answers"Age"?

任何帮助都将非常感激!

在c++非托管应用中使用c#托管应用类

首先,你的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();
...

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