c# - 从 C#/.NET 调用 C++ 函数

标签 c# .net c++-cli unmanaged

我有一个包含 C++ 项目和 C# 项目的解决方案。

C++项目定义了一个类,我想在C#中实例化并调用它的成员函数。到目前为止,我设法实例化了这个类:

CFoo Bar = new CFoo();

但是当我尝试调用它的函数时,编译器说它不可用。

此外,当我在调试器中检查对象时,没有显示任何成员。

我在这里错过了什么?

最佳答案

您需要在 C++/CLI 中将该类声明为 ref class

(请注意,我们谈论的是 C++/CLI,而不是 C++。我假设您必须在 C++ 项目中启用 CLR,否则您将无法获得新的 CFoo工作。)

编辑:

您不需要将所有旧类转换为 ref 类。

假设您有一些旧的 C++:

class FooUnmanaged
{
    int x;

    FooUnmanaged() : x(5) {}
};

然后您尝试将其包装在 CLR 类中:

ref class FooManaged
{
    FooUnmanaged m;
};

正如您所注意到的,您会收到一条错误消息,指出这是不允许的。但是试试这个:

ref class FooManaged
{
    FooUnmanaged *m;
};

那完全没问题。编译器不想分配嵌入在托管堆上的对象内的非托管对象的实例,但很高兴有一个指针,它在生成的 IL 中将其转换为 System.IntPtr .

这意味着您必须决定如何调用delete。最可能的解决方案是:

ref class FooManaged
{
    FooUnmanaged *u;

public:
    FooManaged(FooUnmanaged *u_)
        : u(u_) { }

    ~FooManaged() { delete u; }
};

就像在任何其他 C++ 类中一样。在未来的某个版本中,C++/CLI 可能会自动为我们进行这种翻译。

请注意,生成的 IL 是 FooManaged 类现在实现了 IDisposable,并且析构函数已变成 Dispose 方法。这允许 .NET 客户端正确地释放它,例如在 C# 中

using (var m = new FooManaged())
{

    // end of block: m will be disposed (and so FooUnmanaged will be deleted)
}

关于c# - 从 C#/.NET 调用 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1170892/

相关文章:

c# - 使用按钮切换列表框的可见性?

c# - 错误 CS0234 命名空间 'Reporting' 中不存在类型或命名空间名称 'Microsoft'(您是否缺少程序集引用?)

c# - 无法从 C# 访问的 C++ 包装方法

.net - 如何在 VS2010 中创建混合托管/ native C++ dll?

c# - 理解 DDD 上下文中的命令模式

c# - XmlSerializer - 将 xml 文件迁移到新版本的最佳方式

.net - 是否应该将所有具有返回值的方法都转换为属性?

c# - 当我只知道集合的类型时,如何在 T 的 c# 通用集合中找到 T 的类型?

c# - C#中指针的性能和使用

.net - 抽象密封类