差异CLR和CLI以及如何从纯C调用它们

有人可以告诉我CLR和CLI之间的区别在于它的基本function,但最重要的是哪一个更好?


到目前为止,我得到的是使用ICLRRuntimeHost接口不允许我返回除int之外的任何内容,唯一允许的参数是LPCWSTR (请参阅ExecuteInDefaultAppDomain )

此时我想知道是否可以/将为其C程序中的struct分配内存,将指针作为LPCWSTR stringExecuteInDefaultAppDomain ,并将此指针转换回另一侧的struct以处理该struct 。 我不知道如何使用这个签名器对每个函数的限制: int fncname(string param);


我看了一下这个教程,但我不明白如何从C程序中调用C ++ / CLI,以及如何返回复杂对象或比int更复杂的东西。


有人可以告诉我如何在C中使用CLI ? 我似乎无法找到一些代码行来展示它是如何工作的。


您可以在CLI中传递和返回复杂数据。 CLI是一个中间层。 当您将数据从托管代码(.NET)传递到本机代码(c,c ++)时,您需要一个中间层,它将负责托管到本机对象和反对对话,因为托管对象由垃圾收集器管理,本机对象是由程序员管理(创建时需要删除)。

在C ++ / CLI中有两种类型。 1)Manged class 2)Native class。 托管类定义为:

 public ref class ManagedClass { NativeObject* native; ManagedObject^ mObject; } 

这可以包含托管和本机对象。 因此,在此类中,您将创建一个托管/本机类对象,它是本机/托管对象的副本(就包含数据和方法而言)。 任何对象中的基本数据都是另一个对象或可以轻松转换的基本原始数据。 你必须只处理对象。

假设您要从.NET执行C ++方法。 您的c ++代码有一个名为NativeClass的对象,您的c ++方法返回此本机对象。 您无法将此对象直接传递给.NET层。 因此,您将该对象实例存储在上述类ManagedClass的变量native中。 请注意,您可以在CLI层中访问本机和托管对象。 现在,您在CLI中创建一个manged对象类,它将在包含数据方面完全复制本机类。 现在,将所有日期从Native对象复制到托管对象,并将该托管对象实例分配给变量mObject 。 现在您可以将此变量mObject传递给.NET层,因为这是Manged对象。

将Managed对象传递给Native方法时,可以使用类似的方法。

您可以通过此PDF了解有关C ++ / CLI的更多信息。

http://asawicki.info/Download/Productions/Publications/CPP_CLI_tutorial.pdf


更新:

我会建议你先阅读PDF。 以下是如何进行此转换的简单示例。 NativeObject是C ++对象(您也可以使用C struct实现Class),ManagedObject是C#对象, CLIInterface用于提供接口。

 public ref class CLIInterface { private: NativeObject* native; ManagedObject^ mObject; public: CLIInterface(NativeObject* nativeObj){ native = nativeObj; mObject = gcnew ManagedObject(nativeObj); } string getNativeMessage(); int getNaiveID(); String^ getManagedMessage(); int getmanagedID(); } 

本机类:(C ++ Object或C struct,可以在CLI中使用)

 public class NativeObject { private: int id; string msg; public: string getMessage(){return msg;} int getID(){return id;} } 

托管类:(C#对象,您可以在CLI中使用它)

 public ref class ManagedObject { private: NativeObject* native; public: ManagedObject(NativeObject* obj){ native = obj; } String^ getMessage(){ convertNativeToCLI(native->getMessage()); //you can use marshaling to implement convertNativeToCLI method. } int getID(){ return native->getID(); } } 

您可以使用C#代码中的Managed类对象和CLIInterface,并且可以在C ++代码中使用Native Object。 我希望这将有所帮助。 您还可以访问Microsoft的C ++ / CLI文档。