你好,还是关于C#调C++的问题

2024-11-29 00:37:33
推荐回答(2个)
回答1:

  • ref class是不能直接将本地C++的结构体和类作为成员的,但是你可以使用指针,看下面的代码Student类简单地为NativeStudent类提供了托管接口。

class NativeStudent { 
public:  
    void SetName( const std::wstring & name ) {   
        m_Name = name;  
    }  
    const std::wstring & GetName() {  
        return m_Name;  
    } 
private:  
    std::wstring m_Name; 
};
public ref class Student : public IDisposable { 
public:  
    Student() : m_Student( new NativeStudent ) {  
    }  
    String ^GetName() {  
        return gcnew String( m_Student->GetName().c_str() ); 
    }  
    void SetName( String ^name ) {   
        m_Student->SetName( msclr::interop::marshal_as( name ) );     }  
    ~Student() {   
        delete m_Student;  
    } 
private:  
    NativeStudent *m_Student;
};
  • 如果想在本地C++类中将托管类型作为成员,需要借助gcroot类模板

// 假如有一个SomeAPI函数模板,该模板在内部实现一些操作,  
// 该函数模板需要提供一个对象的指针,以便在完成操作后调用Notify 
// 函数通知对象 
template  
void SomeAPI( T *instance ) {  
    // 执行一些操作  
    instance->Notify( L"任务完成" ); 
}
// 假如我们有如下一个托管类,并且想用这个类来调用上面的函数模板
ref class Callback { 
public:  
    virtual void Notify( String ^text ) {   
        Console::WriteLine( text );  
    } 
};
// 可以首先定义一个中间类,该类的保存托管类的对象实力并且定义了一个本 
// 地的Notify函数,在本地的Notify函数中调用托管类的成员函数 
class NativeCallback { 
public:  
NativeCallback( Callback ^managedCallback )
    : m_ManagedCallback( managedCallback ) {  
}  
void Notify( const std::wstring & text ) {   
    m_ManagedCallback->Notify( gcnew String( text.c_str() ) ); 

private:  
    // 使用gcroot模板来存储托管类对象  
    gcroot m_ManagedCallback;
};
int main() {  
     Callback ^managedCallback = gcnew Callback();  
     NativeCallback nativeCallback( managedCallback );  
     SomeAPI( &nativeCallback );  
     system( "pause" );
}

托管C++我只是知道一点,上面的回答可能有问题,你自己找本教材看看吧!


C#对于大部分人来说已经够用了,不需要使用托管C++。

回答2:

这是结构,,,,,在C#中重新定义 。。。。。。。。。。。。