c# - 包装 INLINE 函数

标签 c# c++ c++-cli wrapper

Possible Duplicate:
C++/CLI Mixed Mode DLL Creation

我正在使用 c++ cli 包装 C++ 类。头文件如下所示:

pabcon.h

class PABCon {
private:
        unsigned int maxIndex;      
        long byteSize;  
public:
    __declspec(dllexport) inline unsigned int GetMaxIndex() { return this->maxIndex; };
    __declspec(dllexport) void invertData();
};

我用这种方式包装非内联函数:

pabconwrapper.h

public ref class PABConWrapper
{
private:
    PABCon *pabc;

public:
    PABConWrapper();
    ~PABConWrapper();
    void invertData();
};

pabconwrapper.cpp

PABConWrapper::PABConWrapper() : pabc(new PABCon())
{

}

void PABConWrapper::invertData()
{
    pabc->invertData();
}

PABConWrapper::~PABConWrapper()
{
    delete pabc;
}

我的问题是:

1) 包装内联 C++ 函数的最佳方式是什么?

2) 我应该如何处理 pabcon.h 中定义的私有(private)变量?我也应该以某种方式包裹它们吗?

谢谢

附注我上次接触 C++ 是在 4 年前,从那时起我就用 C# 编写代码。

最佳答案

内联:将方法标记为内联是向编译器发出的指令,指示编译器不要发出函数调用,而是获取方法的内容,并将其直接放入调用函数中。我相信这只是建议性的,编译器无论如何都可以选择发出函数调用。无论如何,从 C++/CLI 调用此函数时不需要做任何花哨的事情,因此在包装它时也不需要做任何花哨的事情。只需像其他方法一样包装它即可。

私有(private)变量:如果它们是私有(private)变量,那么使用PABCon的非托管C++代码将无法访问它们。 PABCon 的公共(public)接口(interface)只是公共(public)方法,所以这就是您需要担心的。 (如果 C++ 类有任何公共(public)变量,那么您可以通过在 C++/CLI 中创建属性来包装它们。)

~PABConWrapper:在 C++/CLI 中,~ 不是析构函数,而是 dispose 方法。按照现在的实现方式,如果您忘记释放新类,就会出现内存泄漏。至少,将 ~ 切换为 !,并声明终结器。理想情况下,同时实现 !~,删除两个方法中的非托管对象(使用适当的 null 检查),并在其他方法中添加适当的 null 检查。这将是 IDisposable 的良好且正确的实现。

关于c# - 包装 INLINE 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398384/

相关文章:

c++ - 无法从我的 C++ 应用程序获得输出

c# - SQL 数据库 VS。多个平面文件(数以千计的小型 CSV)

dll - 在哪里初始化托管 C++/CLI DLL?

c# - 拆分字符串时使用十六进制作为分隔符

c# - Unity Hololens (UWP) 构建会生成 Standalone 构建不会产生的错误?

c# - DataSet.Copy 与 Dataset.Clone

c# - 没有集合的 TreeView 递归

c++ - 为什么一定要Forward声明一个类,在一个头文件中包含对应的头文件

c++ - 调用静态成员函数导致运行时错误

c# - 在 .NET 中,即使对象的构造函数从未运行过,终结器也可以运行吗?