我有一个用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 ++访问“CPersoana”类,以便我可以在文本框中使用“Name”,“Profession”和“Age”?
非常感谢任何帮助!
答案 0 :(得分:1)
首先,您的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();
...
答案 1 :(得分:-2)
编写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);
}
}