c# - CLR 和 CLI 的区别以及如何从纯 C 中调用它们

标签 c# .net c clr command-line-interface

有人能告诉我 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/

相关文章:

c# - 如何等待异步方法返回?

c# - 在 c# 中读取 excel 文件时, 'microsoft.ace.oledb.12.0' 提供程序未在本地计算机上注册

c# - DateTime.ParseExact 根本不起作用,为什么?

.net - 在 .NET 5 中测试 Azure 函数

c - 为什么 scanf 跳过 '\r' 但读取 '\n?'

html - 如何为 WDI 编写 bison 语法?

c# - 为什么 DateTimeInfo.MonthNames 返回 13 个成员?

c# - 更改设置文件运行时的值

c# - IP 端点 0.0.0.0 :13000. 上已经有一个监听器 ?? (使用 WCF 的 TCP)

c++ - 如何在交叉编译期间强制链接到未安装的库