有人能告诉我 CLR 和 CLI 在基本功能方面的区别吗,但最重要的是哪一个更好?
到目前为止,我得到的是使用 ICLRRuntimeHost
接口(interface)不允许我返回除 int
之外的任何其他内容,唯一允许的参数是 LPCWSTR
(参见 ExecuteInDefaultAppDomain)
在这一点上,我想知道是否可以/愿意分配内存,例如对于他的 C 程序中的 struct
,将一个指针作为 LPCWSTR 字符串
指向 ExecuteInDefaultAppDomain
并将该指针转换回该 struct
在另一边处理那个 struct
。我不明白如何在每个函数的这个签名者的限制下工作:int fncname(string param);
我看了一下this教程,但我不明白如何从 C 程序调用 C++/CLI,以及如何返回复杂对象或比 int
更复杂的对象。
有人可以告诉我如何在 C 中使用 CLI 吗?我似乎找不到一些代码行来说明它是如何工作的。
最佳答案
您可以在 CLI 中传递和返回复杂数据。 CLI 是一个中间层。当您将数据从托管代码(.NET)传递到 native 代码(c,c++)时,您需要一个中间层来负责托管到 native 对象,反之亦然,因为托管对象由垃圾收集器管理,而 native 对象是由程序员管理(创建时需要删除)。
在 C++/CLI 中有两种类型的类。 1) 托管类 2) native 类。托管类定义为:
public ref class ManagedClass
{
NativeObject* native;
ManagedObject^ mObject;
}
这可以包含托管对象和 native 对象。因此,在此类中,您创建了一个托管/ native 类对象,它是 native /托管对象的副本(就包含数据和方法而言)。任何对象中的基本数据要么是另一个对象,要么是可以轻松转换的基本原始数据。你只需要照顾对象。
假设您要执行 .NET 中的 C++ 方法。你的 c++ 代码有一个名为 NativeClass 的对象,你的 c++ 方法返回这个本地对象。您不能将此对象直接传递给 .NET 层。因此,您将该对象实例存储在上述类 ManagedClass 的变量 native 中。请注意,您可以访问 CLI 层中的 native 对象和托管对象。现在您在 CLI 中创建一个托管对象类,它在包含数据方面将是 native 类的精确副本。现在,您将所有日期从 native 对象复制到托管对象,并将该托管对象实例分配给变量 mObject。现在您可以将此变量 mObject 传递给 .NET 层,因为这是托管对象。
当您将托管对象传递给 native 方法时,可以使用类似的方法。
您可以浏览此 PDF 以了解有关 C++/CLI 的更多信息。
http://asawicki.info/Download/Productions/Publications/CPP_CLI_tutorial.pdf
更新:
我建议您先浏览 PDF。下面是一个简单的例子,这个转换是如何发生的。 NativeObject 是 C++ 对象(您也可以用 C struct 代替 Class),ManagedObject 是 C# 对象,CLIInterface用于提供接口(interface)。
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();
}
native 类:(C++ 对象或 C 结构,可在 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# 代码中使用托管类对象和 CLIInterface,也可以在 C++ 代码中使用 native 对象。我希望这个能帮上忙。您还可以转到 Microsoft 的 C++/CLI 文档。
关于c# - CLR 和 CLI 的区别以及如何从纯 C 中调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21593624/