当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 18:01:51 C#

C#学习教程:CLR和CLI的区别以及如何从纯C中调用它们哪一个更好?到目前为止我得到的是使用ICLRRuntimeHost接口不允许我返回除int以外的任何东西,唯一允许的参数是LPCWSTR(请参阅ExecuteInDefaultAppDomain)此时我想知道是否可能/是否会C程序中的结构分配内存,将指向ExecuteInDefaultAppDomain的指针作为LPCWSTR字符串,并将该指针转换回另一端的结构以处理该结构。我不知道如何使用这个签名者来限制每个函数:intfncname(stringparam);我看了一下这个教程,但我不明白如何从C程序调用C++/CLI,以及如何返回一个复杂的对象或比int更复杂的东西。有人能告诉我如何在C中使用CLI吗?我似乎无法找到一些代码行来说明它是如何工作的。您可以在CLI中传递和返回复杂数据。CLI是一个中间层。当您将数据从托管代码(.NET)传递到本机代码(c、c++)时,您需要一个中间层来负责托管到本机对象和对象对话,因为托管对象由垃圾收集器处理Managed,native对象由程序员管理(创建时需要删除)。在C++/CLI中有两种类型。1)托管类2)本机类。托管类定义为:publicrefclassManagedClass{NativeObject*native;托管对象^mObject;这可以包含托管对象和本机对象。因此,在此类中,您创建了一个托管/本机类对象,它是本机/托管对象的副本(就包含数据和方法而言)。任何对象中的基础数据都是另一个对象或基础原始数据,可以很容易地进行转换。你只需要处理对象。假设您要从.NET执行C++方法。你的c++代码有一个名为NativeClass的对象,你的c++方法返回这个本地对象。您不能将此对象直接传递到.NET层。因此,您将该对象实例存储在上述类ManagedClass的变量native中。请注意,您可以在CLI层中访问本机对象和托管对象。现在您在CLI中创建一个托管对象类,它将在包含数据方面完全复制本机类。现在,将所有日期从Native对象复制到托管对象并将此托管对象实例分配给变量mObject。现在您可以将此变量mObject传递给.NET层,因为这是托管对象。将托管对象传递给本机方法时可以使用类似的方法。您可以通过此PDF了解有关C++/CLI的更多信息。http://asawicki.info/Download/Productions/Publications/CPP_CLI_tutorial.pdf更新:我建议您先阅读PDF。这是一个如何进行这种转换的简单示例。NativeObject是C++对象(也可以用Cstruct实现Class),ManagedObject是C#对象,CLIInterface用于提供接口。publicrefclassCLIInterface{private:NativeObject*native;托管对象^mObject;public:CLIInterface(NativeObject*nativeObj){native=nativeObj;mObject=gcnewManagedObject(nativeObj);}字符串getNativeMessage();intgetNaiveID();String^getManagedMessage();intgetmanagedID();}Nativeclass:(C++ObjectorCstruct,canbeusedinCLI)publicclassNativeObject{private:intid;字符串消息;public:stringgetMessage(){返回消息;}intgetID(){returnid;}}托管类:(C#对象,您可以在CLI中使用它)publicrefclassManagedObject{private:NativeObject*native;public:ManagedObject(NativeObject*obj){native=obj;}String^getMessage(){convertNativeToCLI(native->getMessage());//您可以使用封送处理来实现convertNativeToCLI方法。}intgetID(){returnnative->getID();您可以在代码中使用C#Managedclassobject和CLIInterface,在C++代码中可以使用NativeObject。我希望这个能帮上忙。您还可以访问Microsoft的C++/CLI文档。以上为C#学习教程:CLR和CLI的区别以及如何从纯C调用,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: