2013-01-18 99 views
2

可能重复:
C++/CLI Mixed Mode DLL Creation包装内联函数

我包装使用C++类C++ CLI。头文件看起来是这样的:

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中定义的私有变量?我是否应该以某种方式包装它们?

谢谢

P.S.自4年前我已经触摸过C++,并且从那时起用C#编码。

+0

你是说C#与他们互操作吗?你会做另一个函数来访问私有变量,除非你计划在类的字节周围嗅探 – Jay

+0

@Jay,我需要c#中的那些内联函数。 – VladL

+0

如果你只需要调用,就使用PInvoke。 请参阅http://stackoverflow.com/questions/10388405/how-to-make-cp-invoke-code-called-from-c-sharp-thread-safe – Jay

回答

2

inline:标记方法inline是编译器不发出函数调用的指令,而是取出方法的内容并直接放入调用函数中。我相信这只是建议,编译器可以选择发出函数调用。无论如何,从C++/CLI调用这个函数时不需要做任何事情,所以在封装它时不需要做任何事情。就像其他方法一样包装它。

私有变量:如果它们是私有变量,则使用PABCon的非托管C++代码将无法访问它们。 PABCon的公共接口只是公共方法,所以您只需要担心。 (如果C++类有任何公共变量,那么你会在C++/CLI创建一个属性将它们包装。)

~PABConWrapper:在C++/CLI,~不是析构函数,它的Dispose方法。正如现在所执行的那样,如果你忘记处理你的新类,你将会发生内存泄漏。至少,将~切换为!,然后声明终结器。理想情况下,同时执行!~,删除两个方法中的非托管对象(使用适当的空检查),并在其他方法中添加适当的空检查。这将是一个很好的IDisposable的正确实施。

+0

特别感谢指向我destructors /终结者 – VladL