0

私は C++/CLI を初めて使用し、アプリケーションの実行でいくつかの問題に直面しています。アンマネージ コードがマネージ コードを呼び出す必要があるシナリオがあります。そのためにGCHandleを使用しています。それが私のCLIクラスがどのように見えるかです

#pragma once
#include <msclr\gcroot.h>
#include "UnmanagedClass1.h"
using namespace System;

namespace Wrapper {
public ref class WrapperClass
{
private:
    UnmanagedClass::UnmanagedClass1* UnmanagedClass1obj;
    GCHandle delegateHandle_;



public:
    WrapperClass(void);
    delegate void EventDelegate(char *);
           EventDelegate^ nativeCallback_;
    void callback(char *msg);
 };
}

そしてcppファイル

using namespace Wrapper;

WrapperClass::WrapperClass(void)
{
UnmanagedClass1obj = new UnmanagedClass::UnmanagedClass1 ();

nativeCallback_ = gcnew EventDelegate(this, &WrapperClass::callback);

// As long as this handle is alive, the GC will not move or collect the delegate
// This is important, because moving or collecting invalidate the pointer
// that is passed to the native function below
delegateHandle_ = GCHandle::Alloc(nativeCallback_);

// This line will actually get the pointer that can be passed to
// native code
IntPtr ptr = Marshal::GetFunctionPointerForDelegate(nativeCallback_);

// Convert the pointer to the type required by the native code
UnmanagedClass1obj ->RegisterCallback( static_cast<EventCallback>(ptr.ToPointer()) );
   }

   void WrapperClass::callback(char *msg)
   {
//TDO
   }

次のエラーが表示されます

error C2146: syntax error : missing ';' before identifier 'delegateHandle_' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   
error C4430: missing type specifier - int assumed. Note: C++ does not support 
error C2065: 'delegateHandle_' : undeclared identifier
error C2653: 'GCHandle' : is not a class or namespace name  
error C3861: 'Alloc': identifier not found  
error C2653: 'Marshal' : is not a class or namespace name   
error C3861: 'GetFunctionPointerForDelegate': identifier not found

上位 3 つのエラーは .h ファイルにあり、残りは cpp ファイルにあります。

また、実装に関していくつか質問があります。

プロジェクトの出力は dll になります。次に、それを使用して C# コードでコールバックを実装する方法について説明します。つまり、C# クラス オブジェクトを参照として (どのように) または他の方法で渡す必要があるのでしょうか?

C# に戻すために char ポインターを使用しています。より良いデータ型はありますか? たとえば、BSTR? C#、CLI、C++ のメモリをリリースするのは誰ですか?

4

1 に答える 1